{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[Python中的相关分析correlation analysis](https://blog.csdn.net/lll1528238733/article/details/75114360)\n",
    "```txt\n",
    "研究两个或两个以上随机变量之间相互依存关系的方向和密切程度的方法。\n",
    "线性相关关系主要采用皮尔逊（Pearson）相关系数r来度量连续变量之间线性相关强度；\n",
    "r>0,线性正相关；r<0,线性负相关；\n",
    "r=0,两个变量之间不存在线性关系，并不代表两个变量之间不存在任何关系。\n",
    "```\n",
    "##<h2 id=\"curriculum\">相关性度量</h2>\n",
    "```txt\n",
    "线性相关系数r绝对值取值范围 | 相关程度\n",
    ":-- | :--: \n",
    " 0<=r<0.3|低程度相关\n",
    " 0.3<=r<0.8|中度相关\n",
    "0.8<=r<1|中度相关\n",
    "\n",
    "相关分析函数\n",
    "DataFrame.corr()\n",
    "Series.corr(other)\n",
    "函数说明：\n",
    "如果由数据框调用corr函数，那么将会计算每个列两两之间的相似度\n",
    "如果由序列调用corr方法，那么只是该序列与传入的序列之间的相关度\n",
    " ```\n",
    " \n",
    " \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "helper load finish!!!\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\IPython\\core\\interactiveshell.py:2802: DtypeWarning: Columns (8) have mixed types. Specify dtype option on import or set low_memory=False.\n",
      "  if self.run_code(code, result):\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(31179, 2)\n",
      "(31588, 2)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>UID</th>\n",
       "      <th>channel</th>\n",
       "      <th>day</th>\n",
       "      <th>time</th>\n",
       "      <th>trans_amt</th>\n",
       "      <th>amt_src1</th>\n",
       "      <th>merchant</th>\n",
       "      <th>code1</th>\n",
       "      <th>code2</th>\n",
       "      <th>trans_type1</th>\n",
       "      <th>...</th>\n",
       "      <th>ip1</th>\n",
       "      <th>bal</th>\n",
       "      <th>amt_src2</th>\n",
       "      <th>acc_id2</th>\n",
       "      <th>acc_id3</th>\n",
       "      <th>geo_code</th>\n",
       "      <th>trans_type2</th>\n",
       "      <th>market_code</th>\n",
       "      <th>market_type</th>\n",
       "      <th>ip1_sub</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>122913</td>\n",
       "      <td>140</td>\n",
       "      <td>2</td>\n",
       "      <td>09:20:17</td>\n",
       "      <td>8254</td>\n",
       "      <td>a571c7fda8b7df37</td>\n",
       "      <td>fc9fc9836e7cf3a1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>768160899ae359f6</td>\n",
       "      <td>...</td>\n",
       "      <td>f15bed7acee13415</td>\n",
       "      <td>100</td>\n",
       "      <td>a9edadc983f95061</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>wknt</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>ef0652146ed936e4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>120992</td>\n",
       "      <td>102</td>\n",
       "      <td>1</td>\n",
       "      <td>08:27:11</td>\n",
       "      <td>1459</td>\n",
       "      <td>acdbdb842ac20f1e</td>\n",
       "      <td>e36d1d861d5fc9ec</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>26bcf43a19df14c8</td>\n",
       "      <td>...</td>\n",
       "      <td>1f004929873b0d95</td>\n",
       "      <td>100</td>\n",
       "      <td>1ca672c7cb34af43</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>wmr0</td>\n",
       "      <td>102.0</td>\n",
       "      <td>2ecf94369847c748</td>\n",
       "      <td>1.0</td>\n",
       "      <td>659b0c7fc818ff5e</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>2 rows × 27 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "      UID  channel  day      time  trans_amt          amt_src1  \\\n",
       "0  122913      140    2  09:20:17       8254  a571c7fda8b7df37   \n",
       "1  120992      102    1  08:27:11       1459  acdbdb842ac20f1e   \n",
       "\n",
       "           merchant code1 code2       trans_type1        ...         \\\n",
       "0  fc9fc9836e7cf3a1   NaN   NaN  768160899ae359f6        ...          \n",
       "1  e36d1d861d5fc9ec   NaN   NaN  26bcf43a19df14c8        ...          \n",
       "\n",
       "                ip1  bal          amt_src2 acc_id2 acc_id3 geo_code  \\\n",
       "0  f15bed7acee13415  100  a9edadc983f95061     NaN     NaN     wknt   \n",
       "1  1f004929873b0d95  100  1ca672c7cb34af43     NaN     NaN     wmr0   \n",
       "\n",
       "  trans_type2       market_code  market_type           ip1_sub  \n",
       "0         NaN               NaN          NaN  ef0652146ed936e4  \n",
       "1       102.0  2ecf94369847c748          1.0  659b0c7fc818ff5e  \n",
       "\n",
       "[2 rows x 27 columns]"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from base_helper import * \n",
    "\n",
    "op_train = get_operation_train_new()\n",
    "trans_train = get_transaction_train_new()\n",
    "\n",
    "op_test = get_operation_round1_new()\n",
    "trans_test = get_transaction_round1_new()\n",
    "y = get_tag_train_new()\n",
    "sub = get_sub()\n",
    "print(y.shape)\n",
    "print(sub.shape)\n",
    "trans_test.head(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>UID</th>\n",
       "      <th>day</th>\n",
       "      <th>mode</th>\n",
       "      <th>success</th>\n",
       "      <th>time</th>\n",
       "      <th>os</th>\n",
       "      <th>version</th>\n",
       "      <th>device1</th>\n",
       "      <th>device2</th>\n",
       "      <th>device_code1</th>\n",
       "      <th>...</th>\n",
       "      <th>device_code3</th>\n",
       "      <th>mac1</th>\n",
       "      <th>mac2</th>\n",
       "      <th>ip1</th>\n",
       "      <th>ip2</th>\n",
       "      <th>wifi</th>\n",
       "      <th>geo_code</th>\n",
       "      <th>ip1_sub</th>\n",
       "      <th>ip2_sub</th>\n",
       "      <th>Tag</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>10035</td>\n",
       "      <td>30</td>\n",
       "      <td>c8741ce15ceac2a4</td>\n",
       "      <td>1.0</td>\n",
       "      <td>17:51:50</td>\n",
       "      <td>102</td>\n",
       "      <td>7.0.9</td>\n",
       "      <td>49dd36968dbfadda</td>\n",
       "      <td>OPPO R11</td>\n",
       "      <td>ecb58082e0e9b8e2</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>a8dc52f65085212e</td>\n",
       "      <td>55dd8936655c86f6</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>wskx</td>\n",
       "      <td>e58e48fb9215116e</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>16264</td>\n",
       "      <td>16</td>\n",
       "      <td>20a91b45ef8f8221</td>\n",
       "      <td>1.0</td>\n",
       "      <td>08:36:00</td>\n",
       "      <td>200</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>fc7fc47d6c93f554</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>3502c553ea2ac187</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>2 rows × 21 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "     UID  day              mode  success      time   os version  \\\n",
       "0  10035   30  c8741ce15ceac2a4      1.0  17:51:50  102   7.0.9   \n",
       "1  16264   16  20a91b45ef8f8221      1.0  08:36:00  200     NaN   \n",
       "\n",
       "            device1   device2      device_code1 ... device_code3 mac1  \\\n",
       "0  49dd36968dbfadda  OPPO R11  ecb58082e0e9b8e2 ...          NaN  NaN   \n",
       "1               NaN       NaN               NaN ...          NaN  NaN   \n",
       "\n",
       "               mac2               ip1               ip2 wifi geo_code  \\\n",
       "0  a8dc52f65085212e  55dd8936655c86f6               NaN  NaN     wskx   \n",
       "1               NaN               NaN  fc7fc47d6c93f554  NaN      NaN   \n",
       "\n",
       "            ip1_sub           ip2_sub Tag  \n",
       "0  e58e48fb9215116e               NaN   0  \n",
       "1               NaN  3502c553ea2ac187   0  \n",
       "\n",
       "[2 rows x 21 columns]"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "op_train = op_train.merge(y, on='UID', how='left')\n",
    "op_train.head(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0\n"
     ]
    }
   ],
   "source": [
    "dif_value = set(op_train[op_hd.day].tolist()).difference(set(op_test[op_hd.day].tolist()))\n",
    "print(len(dif_value))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\ipykernel\\__main__.py:3: FutureWarning: using a dict on a Series for aggregation\n",
      "is deprecated and will be removed in a future version\n",
      "  app.launch_new_instance()\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>day</th>\n",
       "      <th>tag_cnt</th>\n",
       "      <th>tag_sum</th>\n",
       "      <th>op_tag_sum_r_cnt</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>86456</td>\n",
       "      <td>10876</td>\n",
       "      <td>0.125798</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>56815</td>\n",
       "      <td>4032</td>\n",
       "      <td>0.070967</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>30269</td>\n",
       "      <td>1223</td>\n",
       "      <td>0.040404</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>26958</td>\n",
       "      <td>1741</td>\n",
       "      <td>0.064582</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>35184</td>\n",
       "      <td>1871</td>\n",
       "      <td>0.053178</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>6</td>\n",
       "      <td>29499</td>\n",
       "      <td>1551</td>\n",
       "      <td>0.052578</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>7</td>\n",
       "      <td>29363</td>\n",
       "      <td>1957</td>\n",
       "      <td>0.066649</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>8</td>\n",
       "      <td>99290</td>\n",
       "      <td>12695</td>\n",
       "      <td>0.127858</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>9</td>\n",
       "      <td>47174</td>\n",
       "      <td>3770</td>\n",
       "      <td>0.079917</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>10</td>\n",
       "      <td>30050</td>\n",
       "      <td>1860</td>\n",
       "      <td>0.061897</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>11</td>\n",
       "      <td>19769</td>\n",
       "      <td>2013</td>\n",
       "      <td>0.101826</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>12</td>\n",
       "      <td>23851</td>\n",
       "      <td>4057</td>\n",
       "      <td>0.170098</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>13</td>\n",
       "      <td>24226</td>\n",
       "      <td>1702</td>\n",
       "      <td>0.070255</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>14</td>\n",
       "      <td>30964</td>\n",
       "      <td>3770</td>\n",
       "      <td>0.121754</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>15</td>\n",
       "      <td>113839</td>\n",
       "      <td>12875</td>\n",
       "      <td>0.113098</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>16</td>\n",
       "      <td>71835</td>\n",
       "      <td>4097</td>\n",
       "      <td>0.057033</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>17</td>\n",
       "      <td>38471</td>\n",
       "      <td>2184</td>\n",
       "      <td>0.056770</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>18</td>\n",
       "      <td>37732</td>\n",
       "      <td>2436</td>\n",
       "      <td>0.064561</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>19</td>\n",
       "      <td>36746</td>\n",
       "      <td>2104</td>\n",
       "      <td>0.057258</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>20</td>\n",
       "      <td>40874</td>\n",
       "      <td>2418</td>\n",
       "      <td>0.059157</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>21</td>\n",
       "      <td>30454</td>\n",
       "      <td>3624</td>\n",
       "      <td>0.118999</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>22</td>\n",
       "      <td>104316</td>\n",
       "      <td>12245</td>\n",
       "      <td>0.117384</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>23</td>\n",
       "      <td>62888</td>\n",
       "      <td>2800</td>\n",
       "      <td>0.044524</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>24</td>\n",
       "      <td>29535</td>\n",
       "      <td>2493</td>\n",
       "      <td>0.084408</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>24</th>\n",
       "      <td>25</td>\n",
       "      <td>39241</td>\n",
       "      <td>6055</td>\n",
       "      <td>0.154303</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25</th>\n",
       "      <td>26</td>\n",
       "      <td>36195</td>\n",
       "      <td>8055</td>\n",
       "      <td>0.222545</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26</th>\n",
       "      <td>27</td>\n",
       "      <td>44627</td>\n",
       "      <td>12382</td>\n",
       "      <td>0.277455</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>27</th>\n",
       "      <td>28</td>\n",
       "      <td>34534</td>\n",
       "      <td>6841</td>\n",
       "      <td>0.198095</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28</th>\n",
       "      <td>29</td>\n",
       "      <td>104347</td>\n",
       "      <td>13151</td>\n",
       "      <td>0.126031</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29</th>\n",
       "      <td>30</td>\n",
       "      <td>65341</td>\n",
       "      <td>7627</td>\n",
       "      <td>0.116726</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    day  tag_cnt  tag_sum  op_tag_sum_r_cnt\n",
       "0     1    86456    10876          0.125798\n",
       "1     2    56815     4032          0.070967\n",
       "2     3    30269     1223          0.040404\n",
       "3     4    26958     1741          0.064582\n",
       "4     5    35184     1871          0.053178\n",
       "5     6    29499     1551          0.052578\n",
       "6     7    29363     1957          0.066649\n",
       "7     8    99290    12695          0.127858\n",
       "8     9    47174     3770          0.079917\n",
       "9    10    30050     1860          0.061897\n",
       "10   11    19769     2013          0.101826\n",
       "11   12    23851     4057          0.170098\n",
       "12   13    24226     1702          0.070255\n",
       "13   14    30964     3770          0.121754\n",
       "14   15   113839    12875          0.113098\n",
       "15   16    71835     4097          0.057033\n",
       "16   17    38471     2184          0.056770\n",
       "17   18    37732     2436          0.064561\n",
       "18   19    36746     2104          0.057258\n",
       "19   20    40874     2418          0.059157\n",
       "20   21    30454     3624          0.118999\n",
       "21   22   104316    12245          0.117384\n",
       "22   23    62888     2800          0.044524\n",
       "23   24    29535     2493          0.084408\n",
       "24   25    39241     6055          0.154303\n",
       "25   26    36195     8055          0.222545\n",
       "26   27    44627    12382          0.277455\n",
       "27   28    34534     6841          0.198095\n",
       "28   29   104347    13151          0.126031\n",
       "29   30    65341     7627          0.116726"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tag_gb_st = op_train.groupby([op_hd.day])['Tag'].agg({\n",
    "        \"tag_cnt\": lambda x:x.count(),\n",
    "        \"tag_sum\":np.sum\n",
    "    }).reset_index()\n",
    "# black = op_train.groupby([op_hd.os])['Tag'].\n",
    "# black\n",
    "tag_gb_st[\"op_tag_sum_r_cnt\"] = tag_gb_st['tag_sum']/tag_gb_st['tag_cnt']\n",
    "# op_train.groupby([op_hd.os])['Tag'].sum() \n",
    "tag_gb_st\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>UID</th>\n",
       "      <th>day</th>\n",
       "      <th>success</th>\n",
       "      <th>os</th>\n",
       "      <th>Tag</th>\n",
       "      <th>day_uid_cnt</th>\n",
       "      <th>mode_uid_cnt</th>\n",
       "      <th>mode_uid_nunique</th>\n",
       "      <th>success_uid_cnt</th>\n",
       "      <th>success_uid_nunique</th>\n",
       "      <th>...</th>\n",
       "      <th>Tag_bad_rate</th>\n",
       "      <th>Tag_group_rate</th>\n",
       "      <th>success_uid_cnt_bad_rate</th>\n",
       "      <th>success_uid_cnt_group_rate</th>\n",
       "      <th>success_uid_nunique_bad_rate</th>\n",
       "      <th>success_uid_nunique_group_rate</th>\n",
       "      <th>os_uid_cnt_bad_rate</th>\n",
       "      <th>os_uid_cnt_group_rate</th>\n",
       "      <th>os_uid_nunique_bad_rate</th>\n",
       "      <th>os_uid_nunique_group_rate</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>30000</td>\n",
       "      <td>0.340341</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.770548</td>\n",
       "      <td>-1</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>...</td>\n",
       "      <td>-1</td>\n",
       "      <td>-1</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.770548</td>\n",
       "      <td>0.770548</td>\n",
       "      <td>0.770548</td>\n",
       "      <td>0.770548</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>30001</td>\n",
       "      <td>-0.141631</td>\n",
       "      <td>-0.363081</td>\n",
       "      <td>-0.232819</td>\n",
       "      <td>-1</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>-0.363081</td>\n",
       "      <td>-0.363081</td>\n",
       "      <td>...</td>\n",
       "      <td>-1</td>\n",
       "      <td>-1</td>\n",
       "      <td>-0.363081</td>\n",
       "      <td>-0.363081</td>\n",
       "      <td>-0.363081</td>\n",
       "      <td>-0.363081</td>\n",
       "      <td>-0.232775</td>\n",
       "      <td>-0.232775</td>\n",
       "      <td>-0.232775</td>\n",
       "      <td>-0.232775</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>2 rows × 56 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "     UID       day   success        os  Tag  day_uid_cnt  mode_uid_cnt  \\\n",
       "0  30000  0.340341  0.017146  0.770548   -1    -0.000006     -0.000006   \n",
       "1  30001 -0.141631 -0.363081 -0.232819   -1    -0.000006     -0.000006   \n",
       "\n",
       "   mode_uid_nunique  success_uid_cnt  success_uid_nunique  \\\n",
       "0         -0.000006         0.017146             0.017146   \n",
       "1         -0.000006        -0.363081            -0.363081   \n",
       "\n",
       "             ...              Tag_bad_rate  Tag_group_rate  \\\n",
       "0            ...                        -1              -1   \n",
       "1            ...                        -1              -1   \n",
       "\n",
       "   success_uid_cnt_bad_rate  success_uid_cnt_group_rate  \\\n",
       "0                  0.017146                    0.017146   \n",
       "1                 -0.363081                   -0.363081   \n",
       "\n",
       "   success_uid_nunique_bad_rate  success_uid_nunique_group_rate  \\\n",
       "0                      0.017146                        0.017146   \n",
       "1                     -0.363081                       -0.363081   \n",
       "\n",
       "   os_uid_cnt_bad_rate  os_uid_cnt_group_rate  os_uid_nunique_bad_rate  \\\n",
       "0             0.770548               0.770548                 0.770548   \n",
       "1            -0.232775              -0.232775                -0.232775   \n",
       "\n",
       "   os_uid_nunique_group_rate  \n",
       "0                   0.770548  \n",
       "1                  -0.232775  \n",
       "\n",
       "[2 rows x 56 columns]"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 前向填充，使用默认是上一行的值,设置axis=1可以使用列进行填充\n",
    "op_train_data = op_train_data.fillna(method=\"ffill\")\n",
    "# 后向填充，使用下一行的值,不存在的时候就不填充\n",
    "op_train_data = op_train_data.fillna(method=\"bfill\")\n",
    "# op_train_data.fillna(-1, inplace=True)  # 全空默认 -1\n",
    "op_test_data = op_test_data.fillna(method=\"ffill\")\n",
    "# 后向填充，使用下一行的值,不存在的时候就不填充\n",
    "op_test_data = op_test_data.fillna(method=\"bfill\")\n",
    "op_test_data.head(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>UID</th>\n",
       "      <th>day</th>\n",
       "      <th>mode</th>\n",
       "      <th>success</th>\n",
       "      <th>time</th>\n",
       "      <th>os</th>\n",
       "      <th>version</th>\n",
       "      <th>device1</th>\n",
       "      <th>device2</th>\n",
       "      <th>device_code1</th>\n",
       "      <th>...</th>\n",
       "      <th>ip1</th>\n",
       "      <th>ip2</th>\n",
       "      <th>wifi</th>\n",
       "      <th>geo_code</th>\n",
       "      <th>ip1_sub</th>\n",
       "      <th>ip2_sub</th>\n",
       "      <th>Tag</th>\n",
       "      <th>tag_cnt</th>\n",
       "      <th>tag_sum</th>\n",
       "      <th>op_tag_sum_r_cnt</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>10035</td>\n",
       "      <td>30</td>\n",
       "      <td>c8741ce15ceac2a4</td>\n",
       "      <td>1.0</td>\n",
       "      <td>17:51:50</td>\n",
       "      <td>102</td>\n",
       "      <td>7.0.9</td>\n",
       "      <td>49dd36968dbfadda</td>\n",
       "      <td>OPPO R11</td>\n",
       "      <td>ecb58082e0e9b8e2</td>\n",
       "      <td>...</td>\n",
       "      <td>55dd8936655c86f6</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>wskx</td>\n",
       "      <td>e58e48fb9215116e</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>65341</td>\n",
       "      <td>7627</td>\n",
       "      <td>0.116726</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>16264</td>\n",
       "      <td>16</td>\n",
       "      <td>20a91b45ef8f8221</td>\n",
       "      <td>1.0</td>\n",
       "      <td>08:36:00</td>\n",
       "      <td>200</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>fc7fc47d6c93f554</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>3502c553ea2ac187</td>\n",
       "      <td>0</td>\n",
       "      <td>71835</td>\n",
       "      <td>4097</td>\n",
       "      <td>0.057033</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>13162</td>\n",
       "      <td>8</td>\n",
       "      <td>b668e42707ee9c7b</td>\n",
       "      <td>0.0</td>\n",
       "      <td>18:09:57</td>\n",
       "      <td>102</td>\n",
       "      <td>7.0.5</td>\n",
       "      <td>630a1adff2a87007</td>\n",
       "      <td>MI MAX 2</td>\n",
       "      <td>1da225cb679a37eb</td>\n",
       "      <td>...</td>\n",
       "      <td>2147d925e7a8ba3c</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>3591678eca3f7a23</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>99290</td>\n",
       "      <td>12695</td>\n",
       "      <td>0.127858</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>3 rows × 24 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "     UID  day              mode  success      time   os version  \\\n",
       "0  10035   30  c8741ce15ceac2a4      1.0  17:51:50  102   7.0.9   \n",
       "1  16264   16  20a91b45ef8f8221      1.0  08:36:00  200     NaN   \n",
       "2  13162    8  b668e42707ee9c7b      0.0  18:09:57  102   7.0.5   \n",
       "\n",
       "            device1   device2      device_code1       ...         \\\n",
       "0  49dd36968dbfadda  OPPO R11  ecb58082e0e9b8e2       ...          \n",
       "1               NaN       NaN               NaN       ...          \n",
       "2  630a1adff2a87007  MI MAX 2  1da225cb679a37eb       ...          \n",
       "\n",
       "                ip1               ip2 wifi geo_code           ip1_sub  \\\n",
       "0  55dd8936655c86f6               NaN  NaN     wskx  e58e48fb9215116e   \n",
       "1               NaN  fc7fc47d6c93f554  NaN      NaN               NaN   \n",
       "2  2147d925e7a8ba3c               NaN  NaN      NaN  3591678eca3f7a23   \n",
       "\n",
       "            ip2_sub Tag tag_cnt tag_sum op_tag_sum_r_cnt  \n",
       "0               NaN   0   65341    7627         0.116726  \n",
       "1  3502c553ea2ac187   0   71835    4097         0.057033  \n",
       "2               NaN   0   99290   12695         0.127858  \n",
       "\n",
       "[3 rows x 24 columns]"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "op_train = op_train.merge(tag_gb_st, on=op_hd.day, how='left')\n",
    "op_train.head(3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(388284, 56)\n",
      "(468141, 56)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>UID</th>\n",
       "      <th>day</th>\n",
       "      <th>success</th>\n",
       "      <th>os</th>\n",
       "      <th>Tag</th>\n",
       "      <th>day_uid_cnt</th>\n",
       "      <th>mode_uid_cnt</th>\n",
       "      <th>mode_uid_nunique</th>\n",
       "      <th>success_uid_cnt</th>\n",
       "      <th>success_uid_nunique</th>\n",
       "      <th>...</th>\n",
       "      <th>Tag_bad_rate</th>\n",
       "      <th>Tag_group_rate</th>\n",
       "      <th>success_uid_cnt_bad_rate</th>\n",
       "      <th>success_uid_cnt_group_rate</th>\n",
       "      <th>success_uid_nunique_bad_rate</th>\n",
       "      <th>success_uid_nunique_group_rate</th>\n",
       "      <th>os_uid_cnt_bad_rate</th>\n",
       "      <th>os_uid_cnt_group_rate</th>\n",
       "      <th>os_uid_nunique_bad_rate</th>\n",
       "      <th>os_uid_nunique_group_rate</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>30000</td>\n",
       "      <td>0.340341</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.770548</td>\n",
       "      <td>-1</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>...</td>\n",
       "      <td>-1</td>\n",
       "      <td>-1</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.770548</td>\n",
       "      <td>0.770548</td>\n",
       "      <td>0.770548</td>\n",
       "      <td>0.770548</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>30001</td>\n",
       "      <td>-0.141631</td>\n",
       "      <td>-0.363081</td>\n",
       "      <td>-0.232819</td>\n",
       "      <td>-1</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>-0.363081</td>\n",
       "      <td>-0.363081</td>\n",
       "      <td>...</td>\n",
       "      <td>-1</td>\n",
       "      <td>-1</td>\n",
       "      <td>-0.363081</td>\n",
       "      <td>-0.363081</td>\n",
       "      <td>-0.363081</td>\n",
       "      <td>-0.363081</td>\n",
       "      <td>-0.232775</td>\n",
       "      <td>-0.232775</td>\n",
       "      <td>-0.232775</td>\n",
       "      <td>-0.232775</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>2 rows × 56 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "     UID       day   success        os  Tag  day_uid_cnt  mode_uid_cnt  \\\n",
       "0  30000  0.340341  0.017146  0.770548   -1    -0.000006     -0.000006   \n",
       "1  30001 -0.141631 -0.363081 -0.232819   -1    -0.000006     -0.000006   \n",
       "\n",
       "   mode_uid_nunique  success_uid_cnt  success_uid_nunique  \\\n",
       "0         -0.000006         0.017146             0.017146   \n",
       "1         -0.000006        -0.363081            -0.363081   \n",
       "\n",
       "             ...              Tag_bad_rate  Tag_group_rate  \\\n",
       "0            ...                        -1              -1   \n",
       "1            ...                        -1              -1   \n",
       "\n",
       "   success_uid_cnt_bad_rate  success_uid_cnt_group_rate  \\\n",
       "0                  0.017146                    0.017146   \n",
       "1                 -0.363081                   -0.363081   \n",
       "\n",
       "   success_uid_nunique_bad_rate  success_uid_nunique_group_rate  \\\n",
       "0                      0.017146                        0.017146   \n",
       "1                     -0.363081                       -0.363081   \n",
       "\n",
       "   os_uid_cnt_bad_rate  os_uid_cnt_group_rate  os_uid_nunique_bad_rate  \\\n",
       "0             0.770548               0.770548                 0.770548   \n",
       "1            -0.232775              -0.232775                -0.232775   \n",
       "\n",
       "   os_uid_nunique_group_rate  \n",
       "0                   0.770548  \n",
       "1                  -0.232775  \n",
       "\n",
       "[2 rows x 56 columns]"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "print(op_train_data.shape)\n",
    "# op_test_data = op_test_data.dropna(axis=1,how='any') \n",
    "# op_test_data = op_test_data.dropna(axis=0,how='all') #删除表中全部为NaN的行\n",
    "# op_test_data = op_test_data.dropna(axis=1,how='all') #删除表中全部为NaN的列\n",
    "print(op_test_data.shape)\n",
    "op_test_data.head(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>index</th>\n",
       "      <th>Tag</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>UID</td>\n",
       "      <td>-1.346387e-02</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>day</td>\n",
       "      <td>2.256553e-02</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>success</td>\n",
       "      <td>7.182151e-03</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>os</td>\n",
       "      <td>1.079999e-01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Tag</td>\n",
       "      <td>1.000000e+00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>day_uid_cnt</td>\n",
       "      <td>-9.370254e-15</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>mode_uid_cnt</td>\n",
       "      <td>-9.370254e-15</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>mode_uid_nunique</td>\n",
       "      <td>-9.370254e-15</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>success_uid_cnt</td>\n",
       "      <td>7.182151e-03</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>success_uid_nunique</td>\n",
       "      <td>7.182151e-03</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>time_uid_cnt</td>\n",
       "      <td>-9.370254e-15</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>time_uid_nunique</td>\n",
       "      <td>-9.370254e-15</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>os_uid_cnt</td>\n",
       "      <td>1.400071e-01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>os_uid_nunique</td>\n",
       "      <td>1.399630e-01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>version_uid_cnt</td>\n",
       "      <td>1.873462e-01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>version_uid_nunique</td>\n",
       "      <td>1.873462e-01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>device1_uid_cnt</td>\n",
       "      <td>-9.370254e-15</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>device1_uid_nunique</td>\n",
       "      <td>2.551559e-02</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>device2_uid_cnt</td>\n",
       "      <td>-9.370254e-15</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>device2_uid_nunique</td>\n",
       "      <td>7.541524e-02</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>device_code1_uid_cnt</td>\n",
       "      <td>-2.992600e-02</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>device_code1_uid_nunique</td>\n",
       "      <td>-9.370254e-15</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>device_code2_uid_cnt</td>\n",
       "      <td>-2.003894e-03</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>device_code2_uid_nunique</td>\n",
       "      <td>-9.370254e-15</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>24</th>\n",
       "      <td>mac1_uid_cnt</td>\n",
       "      <td>-9.370254e-15</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25</th>\n",
       "      <td>mac1_uid_nunique</td>\n",
       "      <td>4.832612e-02</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26</th>\n",
       "      <td>ip1_uid_cnt</td>\n",
       "      <td>-9.370254e-15</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>27</th>\n",
       "      <td>ip1_uid_nunique</td>\n",
       "      <td>-9.370254e-15</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28</th>\n",
       "      <td>ip2_uid_cnt</td>\n",
       "      <td>1.051456e-01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29</th>\n",
       "      <td>ip2_uid_nunique</td>\n",
       "      <td>1.208565e-01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30</th>\n",
       "      <td>device_code3_uid_cnt</td>\n",
       "      <td>9.481641e-02</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>31</th>\n",
       "      <td>device_code3_uid_nunique</td>\n",
       "      <td>7.566707e-02</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32</th>\n",
       "      <td>mac2_uid_cnt</td>\n",
       "      <td>-9.370254e-15</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>33</th>\n",
       "      <td>mac2_uid_nunique</td>\n",
       "      <td>-9.370254e-15</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>34</th>\n",
       "      <td>wifi_uid_cnt</td>\n",
       "      <td>5.924868e-02</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>35</th>\n",
       "      <td>wifi_uid_nunique</td>\n",
       "      <td>1.598076e-01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>36</th>\n",
       "      <td>geo_code_uid_cnt</td>\n",
       "      <td>-9.370254e-15</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>37</th>\n",
       "      <td>geo_code_uid_nunique</td>\n",
       "      <td>-9.370254e-15</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38</th>\n",
       "      <td>ip1_sub_uid_cnt</td>\n",
       "      <td>5.351461e-02</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>39</th>\n",
       "      <td>ip1_sub_uid_nunique</td>\n",
       "      <td>8.784810e-02</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40</th>\n",
       "      <td>ip2_sub_uid_cnt</td>\n",
       "      <td>-9.370254e-15</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>41</th>\n",
       "      <td>ip2_sub_uid_nunique</td>\n",
       "      <td>5.666594e-02</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>42</th>\n",
       "      <td>success_bad_rate</td>\n",
       "      <td>7.182151e-03</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>43</th>\n",
       "      <td>success_group_rate</td>\n",
       "      <td>7.182151e-03</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>44</th>\n",
       "      <td>os_bad_rate</td>\n",
       "      <td>1.079999e-01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>45</th>\n",
       "      <td>os_group_rate</td>\n",
       "      <td>1.079999e-01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>46</th>\n",
       "      <td>Tag_bad_rate</td>\n",
       "      <td>1.000000e+00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>47</th>\n",
       "      <td>Tag_group_rate</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>48</th>\n",
       "      <td>success_uid_cnt_bad_rate</td>\n",
       "      <td>7.182151e-03</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>49</th>\n",
       "      <td>success_uid_cnt_group_rate</td>\n",
       "      <td>7.182151e-03</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50</th>\n",
       "      <td>success_uid_nunique_bad_rate</td>\n",
       "      <td>7.182151e-03</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>51</th>\n",
       "      <td>success_uid_nunique_group_rate</td>\n",
       "      <td>7.182151e-03</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>52</th>\n",
       "      <td>os_uid_cnt_bad_rate</td>\n",
       "      <td>1.400071e-01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>53</th>\n",
       "      <td>os_uid_cnt_group_rate</td>\n",
       "      <td>1.400071e-01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>54</th>\n",
       "      <td>os_uid_nunique_bad_rate</td>\n",
       "      <td>1.399630e-01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>55</th>\n",
       "      <td>os_uid_nunique_group_rate</td>\n",
       "      <td>1.399630e-01</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                             index           Tag\n",
       "0                              UID -1.346387e-02\n",
       "1                              day  2.256553e-02\n",
       "2                          success  7.182151e-03\n",
       "3                               os  1.079999e-01\n",
       "4                              Tag  1.000000e+00\n",
       "5                      day_uid_cnt -9.370254e-15\n",
       "6                     mode_uid_cnt -9.370254e-15\n",
       "7                 mode_uid_nunique -9.370254e-15\n",
       "8                  success_uid_cnt  7.182151e-03\n",
       "9              success_uid_nunique  7.182151e-03\n",
       "10                    time_uid_cnt -9.370254e-15\n",
       "11                time_uid_nunique -9.370254e-15\n",
       "12                      os_uid_cnt  1.400071e-01\n",
       "13                  os_uid_nunique  1.399630e-01\n",
       "14                 version_uid_cnt  1.873462e-01\n",
       "15             version_uid_nunique  1.873462e-01\n",
       "16                 device1_uid_cnt -9.370254e-15\n",
       "17             device1_uid_nunique  2.551559e-02\n",
       "18                 device2_uid_cnt -9.370254e-15\n",
       "19             device2_uid_nunique  7.541524e-02\n",
       "20            device_code1_uid_cnt -2.992600e-02\n",
       "21        device_code1_uid_nunique -9.370254e-15\n",
       "22            device_code2_uid_cnt -2.003894e-03\n",
       "23        device_code2_uid_nunique -9.370254e-15\n",
       "24                    mac1_uid_cnt -9.370254e-15\n",
       "25                mac1_uid_nunique  4.832612e-02\n",
       "26                     ip1_uid_cnt -9.370254e-15\n",
       "27                 ip1_uid_nunique -9.370254e-15\n",
       "28                     ip2_uid_cnt  1.051456e-01\n",
       "29                 ip2_uid_nunique  1.208565e-01\n",
       "30            device_code3_uid_cnt  9.481641e-02\n",
       "31        device_code3_uid_nunique  7.566707e-02\n",
       "32                    mac2_uid_cnt -9.370254e-15\n",
       "33                mac2_uid_nunique -9.370254e-15\n",
       "34                    wifi_uid_cnt  5.924868e-02\n",
       "35                wifi_uid_nunique  1.598076e-01\n",
       "36                geo_code_uid_cnt -9.370254e-15\n",
       "37            geo_code_uid_nunique -9.370254e-15\n",
       "38                 ip1_sub_uid_cnt  5.351461e-02\n",
       "39             ip1_sub_uid_nunique  8.784810e-02\n",
       "40                 ip2_sub_uid_cnt -9.370254e-15\n",
       "41             ip2_sub_uid_nunique  5.666594e-02\n",
       "42                success_bad_rate  7.182151e-03\n",
       "43              success_group_rate  7.182151e-03\n",
       "44                     os_bad_rate  1.079999e-01\n",
       "45                   os_group_rate  1.079999e-01\n",
       "46                    Tag_bad_rate  1.000000e+00\n",
       "47                  Tag_group_rate           NaN\n",
       "48        success_uid_cnt_bad_rate  7.182151e-03\n",
       "49      success_uid_cnt_group_rate  7.182151e-03\n",
       "50    success_uid_nunique_bad_rate  7.182151e-03\n",
       "51  success_uid_nunique_group_rate  7.182151e-03\n",
       "52             os_uid_cnt_bad_rate  1.400071e-01\n",
       "53           os_uid_cnt_group_rate  1.400071e-01\n",
       "54         os_uid_nunique_bad_rate  1.399630e-01\n",
       "55       os_uid_nunique_group_rate  1.399630e-01"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tr_corr = op_train_data.corr()['Tag'].reset_index()\n",
    "tr_corr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "54\n",
      "52\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "['success',\n",
       " 'os',\n",
       " 'day_uid_cnt',\n",
       " 'mode_uid_cnt',\n",
       " 'mode_uid_nunique',\n",
       " 'success_uid_cnt',\n",
       " 'success_uid_nunique',\n",
       " 'time_uid_cnt',\n",
       " 'time_uid_nunique',\n",
       " 'os_uid_cnt',\n",
       " 'os_uid_nunique',\n",
       " 'version_uid_cnt',\n",
       " 'version_uid_nunique',\n",
       " 'device1_uid_cnt',\n",
       " 'device1_uid_nunique',\n",
       " 'device2_uid_cnt',\n",
       " 'device2_uid_nunique',\n",
       " 'device_code1_uid_cnt',\n",
       " 'device_code1_uid_nunique',\n",
       " 'device_code2_uid_cnt',\n",
       " 'device_code2_uid_nunique',\n",
       " 'mac1_uid_cnt',\n",
       " 'mac1_uid_nunique',\n",
       " 'ip1_uid_cnt',\n",
       " 'ip1_uid_nunique',\n",
       " 'ip2_uid_cnt',\n",
       " 'ip2_uid_nunique',\n",
       " 'device_code3_uid_cnt',\n",
       " 'device_code3_uid_nunique',\n",
       " 'mac2_uid_cnt',\n",
       " 'mac2_uid_nunique',\n",
       " 'wifi_uid_cnt',\n",
       " 'wifi_uid_nunique',\n",
       " 'geo_code_uid_cnt',\n",
       " 'geo_code_uid_nunique',\n",
       " 'ip1_sub_uid_cnt',\n",
       " 'ip1_sub_uid_nunique',\n",
       " 'ip2_sub_uid_cnt',\n",
       " 'ip2_sub_uid_nunique',\n",
       " 'success_bad_rate',\n",
       " 'success_group_rate',\n",
       " 'os_bad_rate',\n",
       " 'os_group_rate',\n",
       " 'Tag_group_rate',\n",
       " 'success_uid_cnt_bad_rate',\n",
       " 'success_uid_cnt_group_rate',\n",
       " 'success_uid_nunique_bad_rate',\n",
       " 'success_uid_nunique_group_rate',\n",
       " 'os_uid_cnt_bad_rate',\n",
       " 'os_uid_cnt_group_rate',\n",
       " 'os_uid_nunique_bad_rate',\n",
       " 'os_uid_nunique_group_rate']"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cols = tr_corr['index'].tolist()[2:]\n",
    "print(len(cols))\n",
    "[cols.remove(item) if 'Tag' in item else item for item in cols]\n",
    "print(len(cols))\n",
    "cols"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['success',\n",
       " 'os',\n",
       " 'day_uid_cnt',\n",
       " 'mode_uid_cnt',\n",
       " 'mode_uid_nunique',\n",
       " 'success_uid_cnt',\n",
       " 'success_uid_nunique',\n",
       " 'time_uid_cnt',\n",
       " 'time_uid_nunique',\n",
       " 'os_uid_cnt',\n",
       " 'os_uid_nunique',\n",
       " 'version_uid_cnt',\n",
       " 'version_uid_nunique',\n",
       " 'device1_uid_cnt',\n",
       " 'device1_uid_nunique',\n",
       " 'device2_uid_cnt',\n",
       " 'device2_uid_nunique',\n",
       " 'device_code1_uid_cnt',\n",
       " 'device_code1_uid_nunique',\n",
       " 'device_code2_uid_cnt',\n",
       " 'device_code2_uid_nunique',\n",
       " 'mac1_uid_cnt',\n",
       " 'mac1_uid_nunique',\n",
       " 'ip1_uid_cnt',\n",
       " 'ip1_uid_nunique',\n",
       " 'ip2_uid_cnt',\n",
       " 'ip2_uid_nunique',\n",
       " 'device_code3_uid_cnt',\n",
       " 'device_code3_uid_nunique',\n",
       " 'mac2_uid_cnt',\n",
       " 'mac2_uid_nunique',\n",
       " 'wifi_uid_cnt',\n",
       " 'wifi_uid_nunique',\n",
       " 'geo_code_uid_cnt',\n",
       " 'geo_code_uid_nunique',\n",
       " 'ip1_sub_uid_cnt',\n",
       " 'ip1_sub_uid_nunique',\n",
       " 'ip2_sub_uid_cnt',\n",
       " 'ip2_sub_uid_nunique',\n",
       " 'success_bad_rate',\n",
       " 'success_group_rate',\n",
       " 'os_bad_rate',\n",
       " 'os_group_rate',\n",
       " 'success_uid_cnt_bad_rate',\n",
       " 'success_uid_cnt_group_rate',\n",
       " 'success_uid_nunique_bad_rate',\n",
       " 'success_uid_nunique_group_rate',\n",
       " 'os_uid_cnt_bad_rate',\n",
       " 'os_uid_cnt_group_rate',\n",
       " 'os_uid_nunique_bad_rate',\n",
       " 'os_uid_nunique_group_rate']"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cols.remove('Tag_group_rate')\n",
    "cols"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(1462294, 192)\n",
      "(1462294, 56)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>UID</th>\n",
       "      <th>day</th>\n",
       "      <th>success</th>\n",
       "      <th>os</th>\n",
       "      <th>Tag</th>\n",
       "      <th>day_uid_cnt</th>\n",
       "      <th>mode_uid_cnt</th>\n",
       "      <th>mode_uid_nunique</th>\n",
       "      <th>success_uid_cnt</th>\n",
       "      <th>success_uid_nunique</th>\n",
       "      <th>...</th>\n",
       "      <th>Tag_bad_rate</th>\n",
       "      <th>Tag_group_rate</th>\n",
       "      <th>success_uid_cnt_bad_rate</th>\n",
       "      <th>success_uid_cnt_group_rate</th>\n",
       "      <th>success_uid_nunique_bad_rate</th>\n",
       "      <th>success_uid_nunique_group_rate</th>\n",
       "      <th>os_uid_cnt_bad_rate</th>\n",
       "      <th>os_uid_cnt_group_rate</th>\n",
       "      <th>os_uid_nunique_bad_rate</th>\n",
       "      <th>os_uid_nunique_group_rate</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>10000</td>\n",
       "      <td>-0.141631</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.770548</td>\n",
       "      <td>1.0</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>...</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.770548</td>\n",
       "      <td>0.770548</td>\n",
       "      <td>0.770548</td>\n",
       "      <td>0.770548</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>10000</td>\n",
       "      <td>0.340341</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.770548</td>\n",
       "      <td>1.0</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>...</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.770548</td>\n",
       "      <td>0.770548</td>\n",
       "      <td>0.770548</td>\n",
       "      <td>0.770548</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>2 rows × 56 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "     UID       day   success        os  Tag  day_uid_cnt  mode_uid_cnt  \\\n",
       "0  10000 -0.141631  0.017146  0.770548  1.0    -0.000006     -0.000006   \n",
       "1  10000  0.340341  0.017146  0.770548  1.0    -0.000006     -0.000006   \n",
       "\n",
       "   mode_uid_nunique  success_uid_cnt  success_uid_nunique  \\\n",
       "0         -0.000006         0.017146             0.017146   \n",
       "1         -0.000006         0.017146             0.017146   \n",
       "\n",
       "             ...              Tag_bad_rate  Tag_group_rate  \\\n",
       "0            ...                       1.0             1.0   \n",
       "1            ...                       1.0             1.0   \n",
       "\n",
       "   success_uid_cnt_bad_rate  success_uid_cnt_group_rate  \\\n",
       "0                  0.017146                    0.017146   \n",
       "1                  0.017146                    0.017146   \n",
       "\n",
       "   success_uid_nunique_bad_rate  success_uid_nunique_group_rate  \\\n",
       "0                      0.017146                        0.017146   \n",
       "1                      0.017146                        0.017146   \n",
       "\n",
       "   os_uid_cnt_bad_rate  os_uid_cnt_group_rate  os_uid_nunique_bad_rate  \\\n",
       "0             0.770548               0.770548                 0.770548   \n",
       "1             0.770548               0.770548                 0.770548   \n",
       "\n",
       "   os_uid_nunique_group_rate  \n",
       "0                   0.770548  \n",
       "1                   0.770548  \n",
       "\n",
       "[2 rows x 56 columns]"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "print(op_train_data.shape)\n",
    "op_train_data = op_train_data.dropna(axis=1,how='any') \n",
    "op_train_data = op_train_data.dropna(axis=0,how='all') #删除表中全部为NaN的行\n",
    "op_train_data = op_train_data.dropna(axis=1,how='all') #删除表中全部为NaN的列\n",
    "print(op_train_data.shape)\n",
    "op_train_data.head(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>success</th>\n",
       "      <th>os</th>\n",
       "      <th>day_uid_cnt</th>\n",
       "      <th>mode_uid_cnt</th>\n",
       "      <th>mode_uid_nunique</th>\n",
       "      <th>success_uid_cnt</th>\n",
       "      <th>success_uid_nunique</th>\n",
       "      <th>time_uid_cnt</th>\n",
       "      <th>time_uid_nunique</th>\n",
       "      <th>os_uid_cnt</th>\n",
       "      <th>...</th>\n",
       "      <th>os_group_rate</th>\n",
       "      <th>success_uid_cnt_bad_rate</th>\n",
       "      <th>success_uid_cnt_group_rate</th>\n",
       "      <th>success_uid_nunique_bad_rate</th>\n",
       "      <th>success_uid_nunique_group_rate</th>\n",
       "      <th>os_uid_cnt_bad_rate</th>\n",
       "      <th>os_uid_cnt_group_rate</th>\n",
       "      <th>os_uid_nunique_bad_rate</th>\n",
       "      <th>os_uid_nunique_group_rate</th>\n",
       "      <th>UID</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.770548</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>0.770548</td>\n",
       "      <td>...</td>\n",
       "      <td>0.770548</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.770548</td>\n",
       "      <td>0.770548</td>\n",
       "      <td>0.770548</td>\n",
       "      <td>0.770548</td>\n",
       "      <td>30000.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-0.363081</td>\n",
       "      <td>-0.232819</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>-0.363081</td>\n",
       "      <td>-0.363081</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>-0.232775</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.232819</td>\n",
       "      <td>-0.363081</td>\n",
       "      <td>-0.363081</td>\n",
       "      <td>-0.363081</td>\n",
       "      <td>-0.363081</td>\n",
       "      <td>-0.232775</td>\n",
       "      <td>-0.232775</td>\n",
       "      <td>-0.232775</td>\n",
       "      <td>-0.232775</td>\n",
       "      <td>30001.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>2 rows × 52 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "    success        os  day_uid_cnt  mode_uid_cnt  mode_uid_nunique  \\\n",
       "0  0.017146  0.770548    -0.000006     -0.000006         -0.000006   \n",
       "1 -0.363081 -0.232819    -0.000006     -0.000006         -0.000006   \n",
       "\n",
       "   success_uid_cnt  success_uid_nunique  time_uid_cnt  time_uid_nunique  \\\n",
       "0         0.017146             0.017146     -0.000006         -0.000006   \n",
       "1        -0.363081            -0.363081     -0.000006         -0.000006   \n",
       "\n",
       "   os_uid_cnt   ...     os_group_rate  success_uid_cnt_bad_rate  \\\n",
       "0    0.770548   ...          0.770548                  0.017146   \n",
       "1   -0.232775   ...         -0.232819                 -0.363081   \n",
       "\n",
       "   success_uid_cnt_group_rate  success_uid_nunique_bad_rate  \\\n",
       "0                    0.017146                      0.017146   \n",
       "1                   -0.363081                     -0.363081   \n",
       "\n",
       "   success_uid_nunique_group_rate  os_uid_cnt_bad_rate  os_uid_cnt_group_rate  \\\n",
       "0                        0.017146             0.770548               0.770548   \n",
       "1                       -0.363081            -0.232775              -0.232775   \n",
       "\n",
       "   os_uid_nunique_bad_rate  os_uid_nunique_group_rate      UID  \n",
       "0                 0.770548                   0.770548  30000.0  \n",
       "1                -0.232775                  -0.232775  30001.0  \n",
       "\n",
       "[2 rows x 52 columns]"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cols = op_train_data.columns.values\n",
    "op_test_data = op_test_data[cols]\n",
    "op_test_data.head(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(468141, 56)\n",
      "(468141, 56)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>UID</th>\n",
       "      <th>day</th>\n",
       "      <th>success</th>\n",
       "      <th>os</th>\n",
       "      <th>Tag</th>\n",
       "      <th>day_uid_cnt</th>\n",
       "      <th>mode_uid_cnt</th>\n",
       "      <th>mode_uid_nunique</th>\n",
       "      <th>success_uid_cnt</th>\n",
       "      <th>success_uid_nunique</th>\n",
       "      <th>...</th>\n",
       "      <th>Tag_bad_rate</th>\n",
       "      <th>Tag_group_rate</th>\n",
       "      <th>success_uid_cnt_bad_rate</th>\n",
       "      <th>success_uid_cnt_group_rate</th>\n",
       "      <th>success_uid_nunique_bad_rate</th>\n",
       "      <th>success_uid_nunique_group_rate</th>\n",
       "      <th>os_uid_cnt_bad_rate</th>\n",
       "      <th>os_uid_cnt_group_rate</th>\n",
       "      <th>os_uid_nunique_bad_rate</th>\n",
       "      <th>os_uid_nunique_group_rate</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>30000</td>\n",
       "      <td>0.340341</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.770548</td>\n",
       "      <td>-1</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>...</td>\n",
       "      <td>-1</td>\n",
       "      <td>-1</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.770548</td>\n",
       "      <td>0.770548</td>\n",
       "      <td>0.770548</td>\n",
       "      <td>0.770548</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>30001</td>\n",
       "      <td>-0.141631</td>\n",
       "      <td>-0.363081</td>\n",
       "      <td>-0.232819</td>\n",
       "      <td>-1</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>-0.363081</td>\n",
       "      <td>-0.363081</td>\n",
       "      <td>...</td>\n",
       "      <td>-1</td>\n",
       "      <td>-1</td>\n",
       "      <td>-0.363081</td>\n",
       "      <td>-0.363081</td>\n",
       "      <td>-0.363081</td>\n",
       "      <td>-0.363081</td>\n",
       "      <td>-0.232775</td>\n",
       "      <td>-0.232775</td>\n",
       "      <td>-0.232775</td>\n",
       "      <td>-0.232775</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>2 rows × 56 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "      UID       day   success        os  Tag  day_uid_cnt  mode_uid_cnt  \\\n",
       "0   30000  0.340341  0.017146  0.770548   -1    -0.000006     -0.000006   \n",
       "11  30001 -0.141631 -0.363081 -0.232819   -1    -0.000006     -0.000006   \n",
       "\n",
       "    mode_uid_nunique  success_uid_cnt  success_uid_nunique  \\\n",
       "0          -0.000006         0.017146             0.017146   \n",
       "11         -0.000006        -0.363081            -0.363081   \n",
       "\n",
       "              ...              Tag_bad_rate  Tag_group_rate  \\\n",
       "0             ...                        -1              -1   \n",
       "11            ...                        -1              -1   \n",
       "\n",
       "    success_uid_cnt_bad_rate  success_uid_cnt_group_rate  \\\n",
       "0                   0.017146                    0.017146   \n",
       "11                 -0.363081                   -0.363081   \n",
       "\n",
       "    success_uid_nunique_bad_rate  success_uid_nunique_group_rate  \\\n",
       "0                       0.017146                        0.017146   \n",
       "11                     -0.363081                       -0.363081   \n",
       "\n",
       "    os_uid_cnt_bad_rate  os_uid_cnt_group_rate  os_uid_nunique_bad_rate  \\\n",
       "0              0.770548               0.770548                 0.770548   \n",
       "11            -0.232775              -0.232775                -0.232775   \n",
       "\n",
       "    os_uid_nunique_group_rate  \n",
       "0                    0.770548  \n",
       "11                  -0.232775  \n",
       "\n",
       "[2 rows x 56 columns]"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "print(op_test_data.shape)\n",
    "op_test_data.sort_index(inplace =True )\n",
    "op_test_data.drop_duplicates(inplace = True)\n",
    "print(op_test_data.shape)\n",
    "op_test_data.head(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(1462294, 56)\n",
      "(388284, 56)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>UID</th>\n",
       "      <th>day</th>\n",
       "      <th>success</th>\n",
       "      <th>os</th>\n",
       "      <th>Tag</th>\n",
       "      <th>day_uid_cnt</th>\n",
       "      <th>mode_uid_cnt</th>\n",
       "      <th>mode_uid_nunique</th>\n",
       "      <th>success_uid_cnt</th>\n",
       "      <th>success_uid_nunique</th>\n",
       "      <th>...</th>\n",
       "      <th>Tag_bad_rate</th>\n",
       "      <th>Tag_group_rate</th>\n",
       "      <th>success_uid_cnt_bad_rate</th>\n",
       "      <th>success_uid_cnt_group_rate</th>\n",
       "      <th>success_uid_nunique_bad_rate</th>\n",
       "      <th>success_uid_nunique_group_rate</th>\n",
       "      <th>os_uid_cnt_bad_rate</th>\n",
       "      <th>os_uid_cnt_group_rate</th>\n",
       "      <th>os_uid_nunique_bad_rate</th>\n",
       "      <th>os_uid_nunique_group_rate</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>10000</td>\n",
       "      <td>-0.141631</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.770548</td>\n",
       "      <td>1.0</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>...</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.770548</td>\n",
       "      <td>0.770548</td>\n",
       "      <td>0.770548</td>\n",
       "      <td>0.770548</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>10000</td>\n",
       "      <td>0.340341</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.770548</td>\n",
       "      <td>1.0</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>...</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.770548</td>\n",
       "      <td>0.770548</td>\n",
       "      <td>0.770548</td>\n",
       "      <td>0.770548</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>2 rows × 56 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "     UID       day   success        os  Tag  day_uid_cnt  mode_uid_cnt  \\\n",
       "0  10000 -0.141631  0.017146  0.770548  1.0    -0.000006     -0.000006   \n",
       "1  10000  0.340341  0.017146  0.770548  1.0    -0.000006     -0.000006   \n",
       "\n",
       "   mode_uid_nunique  success_uid_cnt  success_uid_nunique  \\\n",
       "0         -0.000006         0.017146             0.017146   \n",
       "1         -0.000006         0.017146             0.017146   \n",
       "\n",
       "             ...              Tag_bad_rate  Tag_group_rate  \\\n",
       "0            ...                       1.0             1.0   \n",
       "1            ...                       1.0             1.0   \n",
       "\n",
       "   success_uid_cnt_bad_rate  success_uid_cnt_group_rate  \\\n",
       "0                  0.017146                    0.017146   \n",
       "1                  0.017146                    0.017146   \n",
       "\n",
       "   success_uid_nunique_bad_rate  success_uid_nunique_group_rate  \\\n",
       "0                      0.017146                        0.017146   \n",
       "1                      0.017146                        0.017146   \n",
       "\n",
       "   os_uid_cnt_bad_rate  os_uid_cnt_group_rate  os_uid_nunique_bad_rate  \\\n",
       "0             0.770548               0.770548                 0.770548   \n",
       "1             0.770548               0.770548                 0.770548   \n",
       "\n",
       "   os_uid_nunique_group_rate  \n",
       "0                   0.770548  \n",
       "1                   0.770548  \n",
       "\n",
       "[2 rows x 56 columns]"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "print(op_train_data.shape)\n",
    "op_train_data.sort_index(inplace =True )\n",
    "op_train_data.drop_duplicates(inplace = True)\n",
    "print(op_train_data.shape)\n",
    "op_train_data.head(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "123\n"
     ]
    }
   ],
   "source": [
    "op_train_data.to_csv(features_base_path + \"op_train_weo_data.csv\", index=False)\n",
    "op_test_data.to_csv(features_base_path + \"op_test_weo_data.csv\", index=False)\n",
    "print(123)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>UID</th>\n",
       "      <th>Tag</th>\n",
       "      <th>day_min</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>10000</td>\n",
       "      <td>1</td>\n",
       "      <td>-0.141631</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>10001</td>\n",
       "      <td>0</td>\n",
       "      <td>-0.193370</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     UID  Tag   day_min\n",
       "0  10000    1 -0.141631\n",
       "1  10001    0 -0.193370"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tr_uid_gb = op_train_data.groupby(['UID'])\n",
    "te_uid_gb = op_test_data.groupby(['UID'])\n",
    "label = label_train.merge(tr_uid_gb['day'].min().reset_index(), on='UID', how='left')\n",
    "cols = list(label.columns.values)\n",
    "cols[-1] = 'day_min'\n",
    "label.columns = cols\n",
    "label.head(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "123\n"
     ]
    }
   ],
   "source": [
    "def get_features02(data, label):\n",
    "    data = data.fillna(method=\"ffill\")\n",
    "    # 后向填充，使用下一行的值,不存在的时候就不填充\n",
    "    data = data.fillna(method=\"bfill\")\n",
    "    data.fillna(-1, inplace=True)  # 全空默认 -1\n",
    "    cols = data.columns.values.tolist()\n",
    "    #     cols.remove(tag_hd.Tag)\n",
    "    cols.remove(tag_hd.UID)\n",
    "    uid_gb = data.groupby(['UID'])\n",
    "    for i,feature in enumerate(cols):\n",
    "        try:\n",
    "            print(i,feature)\n",
    "            label = label.merge(uid_gb[feature].max().reset_index(), on='UID', how='left')\n",
    "            cols = list(label.columns.values)\n",
    "            cols[-1] = feature+str(i)+'max'\n",
    "            label.columns = cols\n",
    "            label = label.merge(uid_gb[feature].min().reset_index(), on='UID', how='left')\n",
    "            cols = list(label.columns.values)\n",
    "            cols[-1] = feature+str(i)+'min'\n",
    "            label.columns = cols\n",
    "            label = label.merge(uid_gb[feature].mean().reset_index(), on='UID', how='left')\n",
    "            cols = list(label.columns.values)\n",
    "            cols[-1] = feature+str(i)+'mean'\n",
    "            label.columns = cols\n",
    "        except:\n",
    "            traceback.print_exc()\n",
    "            print(123)\n",
    "    label = label.fillna(method=\"ffill\")\n",
    "    # 后向填充，使用下一行的值,不存在的时候就不填充\n",
    "    label = label.fillna(method=\"bfill\")\n",
    "    label.fillna(-1, inplace=True)  # 全空默认 -1\n",
    "    return label\n",
    "print(123)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(468141, 52)\n",
      "(388284, 52)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>success</th>\n",
       "      <th>os</th>\n",
       "      <th>day_uid_cnt</th>\n",
       "      <th>mode_uid_cnt</th>\n",
       "      <th>mode_uid_nunique</th>\n",
       "      <th>success_uid_cnt</th>\n",
       "      <th>success_uid_nunique</th>\n",
       "      <th>time_uid_cnt</th>\n",
       "      <th>time_uid_nunique</th>\n",
       "      <th>os_uid_cnt</th>\n",
       "      <th>...</th>\n",
       "      <th>os_group_rate</th>\n",
       "      <th>success_uid_cnt_bad_rate</th>\n",
       "      <th>success_uid_cnt_group_rate</th>\n",
       "      <th>success_uid_nunique_bad_rate</th>\n",
       "      <th>success_uid_nunique_group_rate</th>\n",
       "      <th>os_uid_cnt_bad_rate</th>\n",
       "      <th>os_uid_cnt_group_rate</th>\n",
       "      <th>os_uid_nunique_bad_rate</th>\n",
       "      <th>os_uid_nunique_group_rate</th>\n",
       "      <th>UID</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.770548</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>0.770548</td>\n",
       "      <td>...</td>\n",
       "      <td>0.770548</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.770548</td>\n",
       "      <td>0.770548</td>\n",
       "      <td>0.770548</td>\n",
       "      <td>0.770548</td>\n",
       "      <td>30000.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-0.363081</td>\n",
       "      <td>-0.232819</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>-0.363081</td>\n",
       "      <td>-0.363081</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>-0.232775</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.232819</td>\n",
       "      <td>-0.363081</td>\n",
       "      <td>-0.363081</td>\n",
       "      <td>-0.363081</td>\n",
       "      <td>-0.363081</td>\n",
       "      <td>-0.232775</td>\n",
       "      <td>-0.232775</td>\n",
       "      <td>-0.232775</td>\n",
       "      <td>-0.232775</td>\n",
       "      <td>30001.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>2 rows × 52 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "    success        os  day_uid_cnt  mode_uid_cnt  mode_uid_nunique  \\\n",
       "0  0.017146  0.770548    -0.000006     -0.000006         -0.000006   \n",
       "1 -0.363081 -0.232819    -0.000006     -0.000006         -0.000006   \n",
       "\n",
       "   success_uid_cnt  success_uid_nunique  time_uid_cnt  time_uid_nunique  \\\n",
       "0         0.017146             0.017146     -0.000006         -0.000006   \n",
       "1        -0.363081            -0.363081     -0.000006         -0.000006   \n",
       "\n",
       "   os_uid_cnt   ...     os_group_rate  success_uid_cnt_bad_rate  \\\n",
       "0    0.770548   ...          0.770548                  0.017146   \n",
       "1   -0.232775   ...         -0.232819                 -0.363081   \n",
       "\n",
       "   success_uid_cnt_group_rate  success_uid_nunique_bad_rate  \\\n",
       "0                    0.017146                      0.017146   \n",
       "1                   -0.363081                     -0.363081   \n",
       "\n",
       "   success_uid_nunique_group_rate  os_uid_cnt_bad_rate  os_uid_cnt_group_rate  \\\n",
       "0                        0.017146             0.770548               0.770548   \n",
       "1                       -0.363081            -0.232775              -0.232775   \n",
       "\n",
       "   os_uid_nunique_bad_rate  os_uid_nunique_group_rate      UID  \n",
       "0                 0.770548                   0.770548  30000.0  \n",
       "1                -0.232775                  -0.232775  30001.0  \n",
       "\n",
       "[2 rows x 52 columns]"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cols = list(op_train_data.columns.values)\n",
    "op_test_data = op_test_data[cols] \n",
    "op_train_data[tag_hd.UID] = label_train[tag_hd.UID]\n",
    "op_test_data[tag_hd.UID] = label_test[tag_hd.UID]\n",
    "print(op_test_data.shape)\n",
    "print(op_train_data.shape)\n",
    "op_test_data.head(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>UID</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>10000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     UID\n",
       "0  10000"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# label_test.head(1)\n",
    "label_train.pop('Tag')\n",
    "label_train.head(1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 success\n",
      "1 os\n",
      "2 day_uid_cnt\n",
      "3 mode_uid_cnt\n",
      "4 mode_uid_nunique\n",
      "5 success_uid_cnt\n",
      "6 success_uid_nunique\n",
      "7 time_uid_cnt\n",
      "8 time_uid_nunique\n",
      "9 os_uid_cnt\n",
      "10 os_uid_nunique\n",
      "11 version_uid_cnt\n",
      "12 version_uid_nunique\n",
      "13 device1_uid_cnt\n",
      "14 device1_uid_nunique\n",
      "15 device2_uid_cnt\n",
      "16 device2_uid_nunique\n",
      "17 device_code1_uid_cnt\n",
      "18 device_code1_uid_nunique\n",
      "19 device_code2_uid_cnt\n",
      "20 device_code2_uid_nunique\n",
      "21 mac1_uid_cnt\n",
      "22 mac1_uid_nunique\n",
      "23 ip1_uid_cnt\n",
      "24 ip1_uid_nunique\n",
      "25 ip2_uid_cnt\n",
      "26 ip2_uid_nunique\n",
      "27 device_code3_uid_cnt\n",
      "28 device_code3_uid_nunique\n",
      "29 mac2_uid_cnt\n",
      "30 mac2_uid_nunique\n",
      "31 wifi_uid_cnt\n",
      "32 wifi_uid_nunique\n",
      "33 geo_code_uid_cnt\n",
      "34 geo_code_uid_nunique\n",
      "35 ip1_sub_uid_cnt\n",
      "36 ip1_sub_uid_nunique\n",
      "37 ip2_sub_uid_cnt\n",
      "38 ip2_sub_uid_nunique\n",
      "39 success_bad_rate\n",
      "40 success_group_rate\n",
      "41 os_bad_rate\n",
      "42 os_group_rate\n",
      "43 success_uid_cnt_bad_rate\n",
      "44 success_uid_cnt_group_rate\n",
      "45 success_uid_nunique_bad_rate\n",
      "46 success_uid_nunique_group_rate\n",
      "47 os_uid_cnt_bad_rate\n",
      "48 os_uid_cnt_group_rate\n",
      "49 os_uid_nunique_bad_rate\n",
      "50 os_uid_nunique_group_rate\n",
      "0 success\n",
      "1 os\n",
      "2 day_uid_cnt\n",
      "3 mode_uid_cnt\n",
      "4 mode_uid_nunique\n",
      "5 success_uid_cnt\n",
      "6 success_uid_nunique\n",
      "7 time_uid_cnt\n",
      "8 time_uid_nunique\n",
      "9 os_uid_cnt\n",
      "10 os_uid_nunique\n",
      "11 version_uid_cnt\n",
      "12 version_uid_nunique\n",
      "13 device1_uid_cnt\n",
      "14 device1_uid_nunique\n",
      "15 device2_uid_cnt\n",
      "16 device2_uid_nunique\n",
      "17 device_code1_uid_cnt\n",
      "18 device_code1_uid_nunique\n",
      "19 device_code2_uid_cnt\n",
      "20 device_code2_uid_nunique\n",
      "21 mac1_uid_cnt\n",
      "22 mac1_uid_nunique\n",
      "23 ip1_uid_cnt\n",
      "24 ip1_uid_nunique\n",
      "25 ip2_uid_cnt\n",
      "26 ip2_uid_nunique\n",
      "27 device_code3_uid_cnt\n",
      "28 device_code3_uid_nunique\n",
      "29 mac2_uid_cnt\n",
      "30 mac2_uid_nunique\n",
      "31 wifi_uid_cnt\n",
      "32 wifi_uid_nunique\n",
      "33 geo_code_uid_cnt\n",
      "34 geo_code_uid_nunique\n",
      "35 ip1_sub_uid_cnt\n",
      "36 ip1_sub_uid_nunique\n",
      "37 ip2_sub_uid_cnt\n",
      "38 ip2_sub_uid_nunique\n",
      "39 success_bad_rate\n",
      "40 success_group_rate\n",
      "41 os_bad_rate\n",
      "42 os_group_rate\n",
      "43 success_uid_cnt_bad_rate\n",
      "44 success_uid_cnt_group_rate\n",
      "45 success_uid_nunique_bad_rate\n",
      "46 success_uid_nunique_group_rate\n",
      "47 os_uid_cnt_bad_rate\n",
      "48 os_uid_cnt_group_rate\n",
      "49 os_uid_nunique_bad_rate\n",
      "50 os_uid_nunique_group_rate\n",
      "123\n"
     ]
    }
   ],
   "source": [
    "# op_train_data = op_train_data[cols]\n",
    "# op_test_data = op_test_data[cols]\n",
    "op_train_ftr = get_features02(op_train_data, label_train)\n",
    "op_test_ftr = get_features02(op_test_data, label_test)\n",
    "op_train_ftr.to_csv(features_base_path + \"op_train_weo_ftr.csv\", index=False)\n",
    "op_test_ftr.to_csv(features_base_path + \"op_test_weo_ftr.csv\", index=False)\n",
    "print(123)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(31179, 154)\n",
      "(31198, 154)\n"
     ]
    }
   ],
   "source": [
    "print(op_train_ftr.shape)\n",
    "print(op_test_ftr.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(265291, 251)\n",
      "(170078, 251)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>UID</th>\n",
       "      <th>channel</th>\n",
       "      <th>day</th>\n",
       "      <th>trans_amt</th>\n",
       "      <th>bal</th>\n",
       "      <th>trans_type2</th>\n",
       "      <th>market_type</th>\n",
       "      <th>Tag</th>\n",
       "      <th>day_uid_cnt</th>\n",
       "      <th>channel_uid_cnt</th>\n",
       "      <th>...</th>\n",
       "      <th>market_type_uid_nunique_bad_rate</th>\n",
       "      <th>market_type_uid_nunique_group_rate</th>\n",
       "      <th>ip1_sub_uid_cnt_bad_rate</th>\n",
       "      <th>ip1_sub_uid_cnt_group_rate</th>\n",
       "      <th>ip1_sub_uid_cnt_min</th>\n",
       "      <th>ip1_sub_uid_cnt_max</th>\n",
       "      <th>ip1_sub_uid_nunique_bad_rate</th>\n",
       "      <th>ip1_sub_uid_nunique_group_rate</th>\n",
       "      <th>ip1_sub_uid_nunique_min</th>\n",
       "      <th>ip1_sub_uid_nunique_max</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>30000</td>\n",
       "      <td>-0.616196</td>\n",
       "      <td>0.206766</td>\n",
       "      <td>-0.000022</td>\n",
       "      <td>-0.000022</td>\n",
       "      <td>-0.507464</td>\n",
       "      <td>0.161111</td>\n",
       "      <td>-1</td>\n",
       "      <td>-0.149829</td>\n",
       "      <td>-0.616196</td>\n",
       "      <td>...</td>\n",
       "      <td>0.161111</td>\n",
       "      <td>0.161111</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>30001</td>\n",
       "      <td>-0.616196</td>\n",
       "      <td>-0.043152</td>\n",
       "      <td>-0.000022</td>\n",
       "      <td>-0.000022</td>\n",
       "      <td>-0.507464</td>\n",
       "      <td>0.161111</td>\n",
       "      <td>-1</td>\n",
       "      <td>-0.246146</td>\n",
       "      <td>-0.616196</td>\n",
       "      <td>...</td>\n",
       "      <td>0.161111</td>\n",
       "      <td>0.161111</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>2 rows × 251 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "     UID   channel       day  trans_amt       bal  trans_type2  market_type  \\\n",
       "0  30000 -0.616196  0.206766  -0.000022 -0.000022    -0.507464     0.161111   \n",
       "1  30001 -0.616196 -0.043152  -0.000022 -0.000022    -0.507464     0.161111   \n",
       "\n",
       "   Tag  day_uid_cnt  channel_uid_cnt           ...             \\\n",
       "0   -1    -0.149829        -0.616196           ...              \n",
       "1   -1    -0.246146        -0.616196           ...              \n",
       "\n",
       "   market_type_uid_nunique_bad_rate  market_type_uid_nunique_group_rate  \\\n",
       "0                          0.161111                            0.161111   \n",
       "1                          0.161111                            0.161111   \n",
       "\n",
       "   ip1_sub_uid_cnt_bad_rate  ip1_sub_uid_cnt_group_rate  ip1_sub_uid_cnt_min  \\\n",
       "0                       NaN                         NaN                  NaN   \n",
       "1                       NaN                         NaN                  NaN   \n",
       "\n",
       "   ip1_sub_uid_cnt_max  ip1_sub_uid_nunique_bad_rate  \\\n",
       "0                  NaN                           NaN   \n",
       "1                  NaN                           NaN   \n",
       "\n",
       "   ip1_sub_uid_nunique_group_rate  ip1_sub_uid_nunique_min  \\\n",
       "0                             NaN                      NaN   \n",
       "1                             NaN                      NaN   \n",
       "\n",
       "   ip1_sub_uid_nunique_max  \n",
       "0                      NaN  \n",
       "1                      NaN  \n",
       "\n",
       "[2 rows x 251 columns]"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "trsct_train_data = pd.read_csv(features_base_path + \"trsct_train_data.csv\")\n",
    "trsct_test_data = pd.read_csv(features_base_path + \"trsct_test_data.csv\")\n",
    "# 前向填充，使用默认是上一行的值,设置axis=1可以使用列进行填充\n",
    "trsct_train_data = trsct_train_data.fillna(method=\"ffill\")\n",
    "# 后向填充，使用下一行的值,不存在的时候就不填充\n",
    "trsct_train_data = trsct_train_data.fillna(method=\"bfill\")\n",
    "# op_train_data.fillna(-1, inplace=True)  # 全空默认 -1\n",
    "trsct_test_data = trsct_test_data.fillna(method=\"ffill\")\n",
    "# 后向填充，使用下一行的值,不存在的时候就不填充\n",
    "trsct_test_data = trsct_test_data.fillna(method=\"bfill\")\n",
    "print(trsct_train_data.shape)\n",
    "print(trsct_test_data.shape)\n",
    "trsct_test_data.head(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(170078, 251)\n",
      "(170078, 79)\n",
      "(265291, 251)\n",
      "(265291, 79)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>UID</th>\n",
       "      <th>channel</th>\n",
       "      <th>day</th>\n",
       "      <th>trans_amt</th>\n",
       "      <th>bal</th>\n",
       "      <th>trans_type2</th>\n",
       "      <th>market_type</th>\n",
       "      <th>Tag</th>\n",
       "      <th>day_uid_cnt</th>\n",
       "      <th>channel_uid_cnt</th>\n",
       "      <th>...</th>\n",
       "      <th>ip1_uid_cnt_min</th>\n",
       "      <th>ip1_uid_cnt_max</th>\n",
       "      <th>trans_type2_uid_cnt_bad_rate</th>\n",
       "      <th>trans_type2_uid_cnt_group_rate</th>\n",
       "      <th>trans_type2_uid_nunique_bad_rate</th>\n",
       "      <th>trans_type2_uid_nunique_group_rate</th>\n",
       "      <th>market_type_uid_cnt_bad_rate</th>\n",
       "      <th>market_type_uid_cnt_group_rate</th>\n",
       "      <th>market_type_uid_nunique_bad_rate</th>\n",
       "      <th>market_type_uid_nunique_group_rate</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>10000</td>\n",
       "      <td>-0.616196</td>\n",
       "      <td>0.206766</td>\n",
       "      <td>-0.000022</td>\n",
       "      <td>-0.000022</td>\n",
       "      <td>-0.507464</td>\n",
       "      <td>-0.283936</td>\n",
       "      <td>1.0</td>\n",
       "      <td>-0.246146</td>\n",
       "      <td>-0.616196</td>\n",
       "      <td>...</td>\n",
       "      <td>1.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>-0.507464</td>\n",
       "      <td>-0.507464</td>\n",
       "      <td>-0.507464</td>\n",
       "      <td>-0.507464</td>\n",
       "      <td>-0.283936</td>\n",
       "      <td>-0.283936</td>\n",
       "      <td>-0.283936</td>\n",
       "      <td>-0.283936</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>10000</td>\n",
       "      <td>-0.616196</td>\n",
       "      <td>0.206766</td>\n",
       "      <td>-0.000022</td>\n",
       "      <td>-0.000022</td>\n",
       "      <td>-0.507464</td>\n",
       "      <td>-0.283936</td>\n",
       "      <td>1.0</td>\n",
       "      <td>-0.246146</td>\n",
       "      <td>-0.616196</td>\n",
       "      <td>...</td>\n",
       "      <td>1.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>-0.507464</td>\n",
       "      <td>-0.507464</td>\n",
       "      <td>-0.507464</td>\n",
       "      <td>-0.507464</td>\n",
       "      <td>-0.283936</td>\n",
       "      <td>-0.283936</td>\n",
       "      <td>-0.283936</td>\n",
       "      <td>-0.283936</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>2 rows × 79 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "     UID   channel       day  trans_amt       bal  trans_type2  market_type  \\\n",
       "0  10000 -0.616196  0.206766  -0.000022 -0.000022    -0.507464    -0.283936   \n",
       "1  10000 -0.616196  0.206766  -0.000022 -0.000022    -0.507464    -0.283936   \n",
       "\n",
       "   Tag  day_uid_cnt  channel_uid_cnt                 ...                  \\\n",
       "0  1.0    -0.246146        -0.616196                 ...                   \n",
       "1  1.0    -0.246146        -0.616196                 ...                   \n",
       "\n",
       "   ip1_uid_cnt_min  ip1_uid_cnt_max  trans_type2_uid_cnt_bad_rate  \\\n",
       "0              1.0              2.0                     -0.507464   \n",
       "1              1.0              2.0                     -0.507464   \n",
       "\n",
       "   trans_type2_uid_cnt_group_rate  trans_type2_uid_nunique_bad_rate  \\\n",
       "0                       -0.507464                         -0.507464   \n",
       "1                       -0.507464                         -0.507464   \n",
       "\n",
       "   trans_type2_uid_nunique_group_rate  market_type_uid_cnt_bad_rate  \\\n",
       "0                           -0.507464                     -0.283936   \n",
       "1                           -0.507464                     -0.283936   \n",
       "\n",
       "   market_type_uid_cnt_group_rate  market_type_uid_nunique_bad_rate  \\\n",
       "0                       -0.283936                         -0.283936   \n",
       "1                       -0.283936                         -0.283936   \n",
       "\n",
       "   market_type_uid_nunique_group_rate  \n",
       "0                           -0.283936  \n",
       "1                           -0.283936  \n",
       "\n",
       "[2 rows x 79 columns]"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "print(trsct_test_data.shape)\n",
    "trsct_test_data = trsct_test_data.dropna(axis=1, how='any')\n",
    "trsct_test_data = trsct_test_data.dropna(axis=0, how='all')  # 删除表中全部为NaN的行\n",
    "trsct_test_data = trsct_test_data.dropna(axis=1, how='all')  # 删除表中全部为NaN的列\n",
    "print(trsct_test_data.shape) \n",
    "print(trsct_train_data.shape)\n",
    "trsct_train_data = trsct_train_data.dropna(axis=1, how='any')\n",
    "trsct_train_data = trsct_train_data.dropna(axis=0, how='all')  # 删除表中全部为NaN的行\n",
    "trsct_train_data = trsct_train_data.dropna(axis=1, how='all')  # 删除表中全部为NaN的列\n",
    "print(trsct_train_data.shape)\n",
    "trsct_train_data.head(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(265291, 79)\n",
      "(180669, 79)\n",
      "(170078, 79)\n",
      "(122374, 79)\n"
     ]
    }
   ],
   "source": [
    "print(trsct_train_data.shape)\n",
    "trsct_train_data.sort_index(inplace =True )\n",
    "trsct_train_data.drop_duplicates(inplace = True)\n",
    "print(trsct_train_data.shape)\n",
    "print(trsct_test_data.shape)\n",
    "trsct_test_data.sort_index(inplace =True )\n",
    "trsct_test_data.drop_duplicates(inplace = True)\n",
    "print(trsct_test_data.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>UID</th>\n",
       "      <th>channel</th>\n",
       "      <th>day</th>\n",
       "      <th>trans_amt</th>\n",
       "      <th>bal</th>\n",
       "      <th>trans_type2</th>\n",
       "      <th>market_type</th>\n",
       "      <th>day_uid_cnt</th>\n",
       "      <th>channel_uid_cnt</th>\n",
       "      <th>channel_uid_nunique</th>\n",
       "      <th>...</th>\n",
       "      <th>ip1_uid_cnt_min</th>\n",
       "      <th>ip1_uid_cnt_max</th>\n",
       "      <th>trans_type2_uid_cnt_bad_rate</th>\n",
       "      <th>trans_type2_uid_cnt_group_rate</th>\n",
       "      <th>trans_type2_uid_nunique_bad_rate</th>\n",
       "      <th>trans_type2_uid_nunique_group_rate</th>\n",
       "      <th>market_type_uid_cnt_bad_rate</th>\n",
       "      <th>market_type_uid_cnt_group_rate</th>\n",
       "      <th>market_type_uid_nunique_bad_rate</th>\n",
       "      <th>market_type_uid_nunique_group_rate</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>10000</td>\n",
       "      <td>-0.616196</td>\n",
       "      <td>0.206766</td>\n",
       "      <td>-0.000022</td>\n",
       "      <td>-0.000022</td>\n",
       "      <td>-0.507464</td>\n",
       "      <td>-0.283936</td>\n",
       "      <td>-0.246146</td>\n",
       "      <td>-0.616196</td>\n",
       "      <td>-0.616196</td>\n",
       "      <td>...</td>\n",
       "      <td>1.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>-0.507464</td>\n",
       "      <td>-0.507464</td>\n",
       "      <td>-0.507464</td>\n",
       "      <td>-0.507464</td>\n",
       "      <td>-0.283936</td>\n",
       "      <td>-0.283936</td>\n",
       "      <td>-0.283936</td>\n",
       "      <td>-0.283936</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>10001</td>\n",
       "      <td>0.583065</td>\n",
       "      <td>-0.170174</td>\n",
       "      <td>-0.000022</td>\n",
       "      <td>-0.000022</td>\n",
       "      <td>0.390649</td>\n",
       "      <td>-0.283936</td>\n",
       "      <td>-0.246146</td>\n",
       "      <td>0.583065</td>\n",
       "      <td>0.583065</td>\n",
       "      <td>...</td>\n",
       "      <td>1.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>0.390649</td>\n",
       "      <td>0.390649</td>\n",
       "      <td>0.390649</td>\n",
       "      <td>0.390649</td>\n",
       "      <td>-0.283936</td>\n",
       "      <td>-0.283936</td>\n",
       "      <td>-0.283936</td>\n",
       "      <td>-0.283936</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>2 rows × 77 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "     UID   channel       day  trans_amt       bal  trans_type2  market_type  \\\n",
       "0  10000 -0.616196  0.206766  -0.000022 -0.000022    -0.507464    -0.283936   \n",
       "2  10001  0.583065 -0.170174  -0.000022 -0.000022     0.390649    -0.283936   \n",
       "\n",
       "   day_uid_cnt  channel_uid_cnt  channel_uid_nunique  \\\n",
       "0    -0.246146        -0.616196            -0.616196   \n",
       "2    -0.246146         0.583065             0.583065   \n",
       "\n",
       "                  ...                  ip1_uid_cnt_min  ip1_uid_cnt_max  \\\n",
       "0                 ...                              1.0              2.0   \n",
       "2                 ...                              1.0              2.0   \n",
       "\n",
       "   trans_type2_uid_cnt_bad_rate  trans_type2_uid_cnt_group_rate  \\\n",
       "0                     -0.507464                       -0.507464   \n",
       "2                      0.390649                        0.390649   \n",
       "\n",
       "   trans_type2_uid_nunique_bad_rate  trans_type2_uid_nunique_group_rate  \\\n",
       "0                         -0.507464                           -0.507464   \n",
       "2                          0.390649                            0.390649   \n",
       "\n",
       "   market_type_uid_cnt_bad_rate  market_type_uid_cnt_group_rate  \\\n",
       "0                     -0.283936                       -0.283936   \n",
       "2                     -0.283936                       -0.283936   \n",
       "\n",
       "   market_type_uid_nunique_bad_rate  market_type_uid_nunique_group_rate  \n",
       "0                         -0.283936                           -0.283936  \n",
       "2                         -0.283936                           -0.283936  \n",
       "\n",
       "[2 rows x 77 columns]"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cols = list(trsct_train_data.columns.values)\n",
    "[cols.remove(item) if 'Tag' in item else item for item in cols]\n",
    "trsct_train_data = trsct_train_data[cols]\n",
    "trsct_train_data.head(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(468141, 52)\n",
      "(388284, 52)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>success</th>\n",
       "      <th>os</th>\n",
       "      <th>day_uid_cnt</th>\n",
       "      <th>mode_uid_cnt</th>\n",
       "      <th>mode_uid_nunique</th>\n",
       "      <th>success_uid_cnt</th>\n",
       "      <th>success_uid_nunique</th>\n",
       "      <th>time_uid_cnt</th>\n",
       "      <th>time_uid_nunique</th>\n",
       "      <th>os_uid_cnt</th>\n",
       "      <th>...</th>\n",
       "      <th>os_group_rate</th>\n",
       "      <th>success_uid_cnt_bad_rate</th>\n",
       "      <th>success_uid_cnt_group_rate</th>\n",
       "      <th>success_uid_nunique_bad_rate</th>\n",
       "      <th>success_uid_nunique_group_rate</th>\n",
       "      <th>os_uid_cnt_bad_rate</th>\n",
       "      <th>os_uid_cnt_group_rate</th>\n",
       "      <th>os_uid_nunique_bad_rate</th>\n",
       "      <th>os_uid_nunique_group_rate</th>\n",
       "      <th>UID</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.770548</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>0.770548</td>\n",
       "      <td>...</td>\n",
       "      <td>0.770548</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.017146</td>\n",
       "      <td>0.770548</td>\n",
       "      <td>0.770548</td>\n",
       "      <td>0.770548</td>\n",
       "      <td>0.770548</td>\n",
       "      <td>30000.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-0.363081</td>\n",
       "      <td>-0.232819</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>-0.363081</td>\n",
       "      <td>-0.363081</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>-0.000006</td>\n",
       "      <td>-0.232775</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.232819</td>\n",
       "      <td>-0.363081</td>\n",
       "      <td>-0.363081</td>\n",
       "      <td>-0.363081</td>\n",
       "      <td>-0.363081</td>\n",
       "      <td>-0.232775</td>\n",
       "      <td>-0.232775</td>\n",
       "      <td>-0.232775</td>\n",
       "      <td>-0.232775</td>\n",
       "      <td>30001.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>2 rows × 52 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "    success        os  day_uid_cnt  mode_uid_cnt  mode_uid_nunique  \\\n",
       "0  0.017146  0.770548    -0.000006     -0.000006         -0.000006   \n",
       "1 -0.363081 -0.232819    -0.000006     -0.000006         -0.000006   \n",
       "\n",
       "   success_uid_cnt  success_uid_nunique  time_uid_cnt  time_uid_nunique  \\\n",
       "0         0.017146             0.017146     -0.000006         -0.000006   \n",
       "1        -0.363081            -0.363081     -0.000006         -0.000006   \n",
       "\n",
       "   os_uid_cnt   ...     os_group_rate  success_uid_cnt_bad_rate  \\\n",
       "0    0.770548   ...          0.770548                  0.017146   \n",
       "1   -0.232775   ...         -0.232819                 -0.363081   \n",
       "\n",
       "   success_uid_cnt_group_rate  success_uid_nunique_bad_rate  \\\n",
       "0                    0.017146                      0.017146   \n",
       "1                   -0.363081                     -0.363081   \n",
       "\n",
       "   success_uid_nunique_group_rate  os_uid_cnt_bad_rate  os_uid_cnt_group_rate  \\\n",
       "0                        0.017146             0.770548               0.770548   \n",
       "1                       -0.363081            -0.232775              -0.232775   \n",
       "\n",
       "   os_uid_nunique_bad_rate  os_uid_nunique_group_rate      UID  \n",
       "0                 0.770548                   0.770548  30000.0  \n",
       "1                -0.232775                  -0.232775  30001.0  \n",
       "\n",
       "[2 rows x 52 columns]"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "trsct_test_data = trsct_test_data[cols] \n",
    "trsct_train_data[tag_hd.UID] = label_train[tag_hd.UID]\n",
    "trsct_test_data[tag_hd.UID] = label_test[tag_hd.UID]\n",
    "print(op_test_data.shape)\n",
    "print(op_train_data.shape)\n",
    "op_test_data.head(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 channel\n",
      "1 day\n",
      "2 trans_amt\n",
      "3 bal\n",
      "4 trans_type2\n",
      "5 market_type\n",
      "6 day_uid_cnt\n",
      "7 channel_uid_cnt\n",
      "8 channel_uid_nunique\n",
      "9 trans_amt_uid_cnt\n",
      "10 trans_amt_uid_nunique\n",
      "11 time_uid_cnt\n",
      "12 time_uid_nunique\n",
      "13 amt_src1_uid_cnt\n",
      "14 amt_src1_uid_nunique\n",
      "15 merchant_uid_cnt\n",
      "16 merchant_uid_nunique\n",
      "17 code1_uid_cnt\n",
      "18 code1_uid_nunique\n",
      "19 code2_uid_cnt\n",
      "20 code2_uid_nunique\n",
      "21 trans_type1_uid_cnt\n",
      "22 trans_type1_uid_nunique\n",
      "23 acc_id1_uid_cnt\n",
      "24 acc_id1_uid_nunique\n",
      "25 mac1_uid_cnt\n",
      "26 mac1_uid_nunique\n",
      "27 device2_uid_cnt\n",
      "28 device2_uid_nunique\n",
      "29 device1_uid_cnt\n",
      "30 device1_uid_nunique\n",
      "31 device_code3_uid_cnt\n",
      "32 device_code3_uid_nunique\n",
      "33 bal_uid_cnt\n",
      "34 bal_uid_nunique\n",
      "35 ip1_uid_cnt\n",
      "36 ip1_uid_nunique\n",
      "37 amt_src2_uid_cnt\n",
      "38 amt_src2_uid_nunique\n",
      "39 acc_id2_uid_cnt\n",
      "40 acc_id2_uid_nunique\n",
      "41 acc_id3_uid_cnt\n",
      "42 acc_id3_uid_nunique\n",
      "43 geocode_uid_cnt\n",
      "44 geocode_uid_nunique\n",
      "45 trans_type2_uid_cnt\n",
      "46 trans_type2_uid_nunique\n",
      "47 market_code_uid_cnt\n",
      "48 market_code_uid_nunique\n",
      "49 market_type_uid_cnt\n",
      "50 market_type_uid_nunique\n",
      "51 ip1_sub_uid_cnt\n",
      "52 ip1_sub_uid_nunique\n",
      "53 channel_bad_rate\n",
      "54 channel_group_rate\n",
      "55 trans_type2_bad_rate\n",
      "56 trans_type2_group_rate\n",
      "57 market_type_bad_rate\n",
      "58 market_type_group_rate\n",
      "59 Tag_group_rate\n",
      "60 channel_uid_cnt_bad_rate\n",
      "61 channel_uid_cnt_group_rate\n",
      "62 channel_uid_nunique_bad_rate\n",
      "63 channel_uid_nunique_group_rate\n",
      "64 ip1_uid_cnt_bad_rate\n",
      "65 ip1_uid_cnt_group_rate\n",
      "66 ip1_uid_cnt_min\n",
      "67 ip1_uid_cnt_max\n",
      "68 trans_type2_uid_cnt_bad_rate\n",
      "69 trans_type2_uid_cnt_group_rate\n",
      "70 trans_type2_uid_nunique_bad_rate\n",
      "71 trans_type2_uid_nunique_group_rate\n",
      "72 market_type_uid_cnt_bad_rate\n",
      "73 market_type_uid_cnt_group_rate\n",
      "74 market_type_uid_nunique_bad_rate\n",
      "75 market_type_uid_nunique_group_rate\n",
      "0 channel\n",
      "1 day\n",
      "2 trans_amt\n",
      "3 bal\n",
      "4 trans_type2\n",
      "5 market_type\n",
      "6 day_uid_cnt\n",
      "7 channel_uid_cnt\n",
      "8 channel_uid_nunique\n",
      "9 trans_amt_uid_cnt\n",
      "10 trans_amt_uid_nunique\n",
      "11 time_uid_cnt\n",
      "12 time_uid_nunique\n",
      "13 amt_src1_uid_cnt\n",
      "14 amt_src1_uid_nunique\n",
      "15 merchant_uid_cnt\n",
      "16 merchant_uid_nunique\n",
      "17 code1_uid_cnt\n",
      "18 code1_uid_nunique\n",
      "19 code2_uid_cnt\n",
      "20 code2_uid_nunique\n",
      "21 trans_type1_uid_cnt\n",
      "22 trans_type1_uid_nunique\n",
      "23 acc_id1_uid_cnt\n",
      "24 acc_id1_uid_nunique\n",
      "25 mac1_uid_cnt\n",
      "26 mac1_uid_nunique\n",
      "27 device2_uid_cnt\n",
      "28 device2_uid_nunique\n",
      "29 device1_uid_cnt\n",
      "30 device1_uid_nunique\n",
      "31 device_code3_uid_cnt\n",
      "32 device_code3_uid_nunique\n",
      "33 bal_uid_cnt\n",
      "34 bal_uid_nunique\n",
      "35 ip1_uid_cnt\n",
      "36 ip1_uid_nunique\n",
      "37 amt_src2_uid_cnt\n",
      "38 amt_src2_uid_nunique\n",
      "39 acc_id2_uid_cnt\n",
      "40 acc_id2_uid_nunique\n",
      "41 acc_id3_uid_cnt\n",
      "42 acc_id3_uid_nunique\n",
      "43 geocode_uid_cnt\n",
      "44 geocode_uid_nunique\n",
      "45 trans_type2_uid_cnt\n",
      "46 trans_type2_uid_nunique\n",
      "47 market_code_uid_cnt\n",
      "48 market_code_uid_nunique\n",
      "49 market_type_uid_cnt\n",
      "50 market_type_uid_nunique\n",
      "51 ip1_sub_uid_cnt\n",
      "52 ip1_sub_uid_nunique\n",
      "53 channel_bad_rate\n",
      "54 channel_group_rate\n",
      "55 trans_type2_bad_rate\n",
      "56 trans_type2_group_rate\n",
      "57 market_type_bad_rate\n",
      "58 market_type_group_rate\n",
      "59 Tag_group_rate\n",
      "60 channel_uid_cnt_bad_rate\n",
      "61 channel_uid_cnt_group_rate\n",
      "62 channel_uid_nunique_bad_rate\n",
      "63 channel_uid_nunique_group_rate\n",
      "64 ip1_uid_cnt_bad_rate\n",
      "65 ip1_uid_cnt_group_rate\n",
      "66 ip1_uid_cnt_min\n",
      "67 ip1_uid_cnt_max\n",
      "68 trans_type2_uid_cnt_bad_rate\n",
      "69 trans_type2_uid_cnt_group_rate\n",
      "70 trans_type2_uid_nunique_bad_rate\n",
      "71 trans_type2_uid_nunique_group_rate\n",
      "72 market_type_uid_cnt_bad_rate\n",
      "73 market_type_uid_cnt_group_rate\n",
      "74 market_type_uid_nunique_bad_rate\n",
      "75 market_type_uid_nunique_group_rate\n",
      "(31179, 229)\n",
      "(31198, 229)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>UID</th>\n",
       "      <th>channel0max</th>\n",
       "      <th>channel0min</th>\n",
       "      <th>channel0mean</th>\n",
       "      <th>day1max</th>\n",
       "      <th>day1min</th>\n",
       "      <th>day1mean</th>\n",
       "      <th>trans_amt2max</th>\n",
       "      <th>trans_amt2min</th>\n",
       "      <th>trans_amt2mean</th>\n",
       "      <th>...</th>\n",
       "      <th>market_type_uid_cnt_bad_rate72mean</th>\n",
       "      <th>market_type_uid_cnt_group_rate73max</th>\n",
       "      <th>market_type_uid_cnt_group_rate73min</th>\n",
       "      <th>market_type_uid_cnt_group_rate73mean</th>\n",
       "      <th>market_type_uid_nunique_bad_rate74max</th>\n",
       "      <th>market_type_uid_nunique_bad_rate74min</th>\n",
       "      <th>market_type_uid_nunique_bad_rate74mean</th>\n",
       "      <th>market_type_uid_nunique_group_rate75max</th>\n",
       "      <th>market_type_uid_nunique_group_rate75min</th>\n",
       "      <th>market_type_uid_nunique_group_rate75mean</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>30000</td>\n",
       "      <td>-0.616196</td>\n",
       "      <td>-0.616196</td>\n",
       "      <td>-0.616196</td>\n",
       "      <td>0.206766</td>\n",
       "      <td>0.206766</td>\n",
       "      <td>0.206766</td>\n",
       "      <td>-0.000022</td>\n",
       "      <td>-0.000022</td>\n",
       "      <td>-0.000022</td>\n",
       "      <td>...</td>\n",
       "      <td>0.161111</td>\n",
       "      <td>0.161111</td>\n",
       "      <td>0.161111</td>\n",
       "      <td>0.161111</td>\n",
       "      <td>0.161111</td>\n",
       "      <td>0.161111</td>\n",
       "      <td>0.161111</td>\n",
       "      <td>0.161111</td>\n",
       "      <td>0.161111</td>\n",
       "      <td>0.161111</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>30001</td>\n",
       "      <td>-0.616196</td>\n",
       "      <td>-0.616196</td>\n",
       "      <td>-0.616196</td>\n",
       "      <td>-0.043152</td>\n",
       "      <td>-0.043152</td>\n",
       "      <td>-0.043152</td>\n",
       "      <td>-0.000022</td>\n",
       "      <td>-0.000022</td>\n",
       "      <td>-0.000022</td>\n",
       "      <td>...</td>\n",
       "      <td>0.161111</td>\n",
       "      <td>0.161111</td>\n",
       "      <td>0.161111</td>\n",
       "      <td>0.161111</td>\n",
       "      <td>0.161111</td>\n",
       "      <td>0.161111</td>\n",
       "      <td>0.161111</td>\n",
       "      <td>0.161111</td>\n",
       "      <td>0.161111</td>\n",
       "      <td>0.161111</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>30002</td>\n",
       "      <td>-0.616196</td>\n",
       "      <td>-0.616196</td>\n",
       "      <td>-0.616196</td>\n",
       "      <td>-0.043152</td>\n",
       "      <td>-0.043152</td>\n",
       "      <td>-0.043152</td>\n",
       "      <td>-0.000022</td>\n",
       "      <td>-0.000022</td>\n",
       "      <td>-0.000022</td>\n",
       "      <td>...</td>\n",
       "      <td>0.161111</td>\n",
       "      <td>0.161111</td>\n",
       "      <td>0.161111</td>\n",
       "      <td>0.161111</td>\n",
       "      <td>0.161111</td>\n",
       "      <td>0.161111</td>\n",
       "      <td>0.161111</td>\n",
       "      <td>0.161111</td>\n",
       "      <td>0.161111</td>\n",
       "      <td>0.161111</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>30003</td>\n",
       "      <td>-0.616196</td>\n",
       "      <td>-0.616196</td>\n",
       "      <td>-0.616196</td>\n",
       "      <td>-0.043152</td>\n",
       "      <td>-0.043152</td>\n",
       "      <td>-0.043152</td>\n",
       "      <td>-0.000022</td>\n",
       "      <td>-0.000022</td>\n",
       "      <td>-0.000022</td>\n",
       "      <td>...</td>\n",
       "      <td>0.161111</td>\n",
       "      <td>0.161111</td>\n",
       "      <td>0.161111</td>\n",
       "      <td>0.161111</td>\n",
       "      <td>0.161111</td>\n",
       "      <td>0.161111</td>\n",
       "      <td>0.161111</td>\n",
       "      <td>0.161111</td>\n",
       "      <td>0.161111</td>\n",
       "      <td>0.161111</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>30004</td>\n",
       "      <td>-0.616196</td>\n",
       "      <td>-0.616196</td>\n",
       "      <td>-0.616196</td>\n",
       "      <td>-0.043152</td>\n",
       "      <td>-0.043152</td>\n",
       "      <td>-0.043152</td>\n",
       "      <td>-0.000022</td>\n",
       "      <td>-0.000022</td>\n",
       "      <td>-0.000022</td>\n",
       "      <td>...</td>\n",
       "      <td>0.161111</td>\n",
       "      <td>0.161111</td>\n",
       "      <td>0.161111</td>\n",
       "      <td>0.161111</td>\n",
       "      <td>0.161111</td>\n",
       "      <td>0.161111</td>\n",
       "      <td>0.161111</td>\n",
       "      <td>0.161111</td>\n",
       "      <td>0.161111</td>\n",
       "      <td>0.161111</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 229 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "     UID  channel0max  channel0min  channel0mean   day1max   day1min  \\\n",
       "0  30000    -0.616196    -0.616196     -0.616196  0.206766  0.206766   \n",
       "1  30001    -0.616196    -0.616196     -0.616196 -0.043152 -0.043152   \n",
       "2  30002    -0.616196    -0.616196     -0.616196 -0.043152 -0.043152   \n",
       "3  30003    -0.616196    -0.616196     -0.616196 -0.043152 -0.043152   \n",
       "4  30004    -0.616196    -0.616196     -0.616196 -0.043152 -0.043152   \n",
       "\n",
       "   day1mean  trans_amt2max  trans_amt2min  trans_amt2mean  \\\n",
       "0  0.206766      -0.000022      -0.000022       -0.000022   \n",
       "1 -0.043152      -0.000022      -0.000022       -0.000022   \n",
       "2 -0.043152      -0.000022      -0.000022       -0.000022   \n",
       "3 -0.043152      -0.000022      -0.000022       -0.000022   \n",
       "4 -0.043152      -0.000022      -0.000022       -0.000022   \n",
       "\n",
       "                     ...                     \\\n",
       "0                    ...                      \n",
       "1                    ...                      \n",
       "2                    ...                      \n",
       "3                    ...                      \n",
       "4                    ...                      \n",
       "\n",
       "   market_type_uid_cnt_bad_rate72mean  market_type_uid_cnt_group_rate73max  \\\n",
       "0                            0.161111                             0.161111   \n",
       "1                            0.161111                             0.161111   \n",
       "2                            0.161111                             0.161111   \n",
       "3                            0.161111                             0.161111   \n",
       "4                            0.161111                             0.161111   \n",
       "\n",
       "   market_type_uid_cnt_group_rate73min  market_type_uid_cnt_group_rate73mean  \\\n",
       "0                             0.161111                              0.161111   \n",
       "1                             0.161111                              0.161111   \n",
       "2                             0.161111                              0.161111   \n",
       "3                             0.161111                              0.161111   \n",
       "4                             0.161111                              0.161111   \n",
       "\n",
       "   market_type_uid_nunique_bad_rate74max  \\\n",
       "0                               0.161111   \n",
       "1                               0.161111   \n",
       "2                               0.161111   \n",
       "3                               0.161111   \n",
       "4                               0.161111   \n",
       "\n",
       "   market_type_uid_nunique_bad_rate74min  \\\n",
       "0                               0.161111   \n",
       "1                               0.161111   \n",
       "2                               0.161111   \n",
       "3                               0.161111   \n",
       "4                               0.161111   \n",
       "\n",
       "   market_type_uid_nunique_bad_rate74mean  \\\n",
       "0                                0.161111   \n",
       "1                                0.161111   \n",
       "2                                0.161111   \n",
       "3                                0.161111   \n",
       "4                                0.161111   \n",
       "\n",
       "   market_type_uid_nunique_group_rate75max  \\\n",
       "0                                 0.161111   \n",
       "1                                 0.161111   \n",
       "2                                 0.161111   \n",
       "3                                 0.161111   \n",
       "4                                 0.161111   \n",
       "\n",
       "   market_type_uid_nunique_group_rate75min  \\\n",
       "0                                 0.161111   \n",
       "1                                 0.161111   \n",
       "2                                 0.161111   \n",
       "3                                 0.161111   \n",
       "4                                 0.161111   \n",
       "\n",
       "   market_type_uid_nunique_group_rate75mean  \n",
       "0                                  0.161111  \n",
       "1                                  0.161111  \n",
       "2                                  0.161111  \n",
       "3                                  0.161111  \n",
       "4                                  0.161111  \n",
       "\n",
       "[5 rows x 229 columns]"
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "trsct_train_ftr = get_features02(trsct_train_data, label_train)\n",
    "trsct_test_ftr = get_features02(trsct_test_data, label_test)\n",
    "trsct_train_ftr.to_csv(features_base_path + \"trsct_train_weo_ftr.csv\", index=False)\n",
    "trsct_test_ftr.to_csv(features_base_path + \"trsct_test_weo_ftr.csv\", index=False)\n",
    "print(trsct_train_ftr.shape)\n",
    "print(trsct_test_ftr.shape)\n",
    "trsct_test_ftr.head(5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>17opos_y</th>\n",
       "      <th>58opmode_uid_cnt_x</th>\n",
       "      <th>60opmode_uid_cnt_x</th>\n",
       "      <th>61opmode_uid_cnt_y</th>\n",
       "      <th>62opmode_uid_cnt_x</th>\n",
       "      <th>66opmode_op_cnt_rate_x</th>\n",
       "      <th>68opmode_op_cnt_rate_x</th>\n",
       "      <th>69opmode_op_cnt_rate_y</th>\n",
       "      <th>70opmode_op_cnt_rate_x</th>\n",
       "      <th>77opmode_uid_nunique_y</th>\n",
       "      <th>...</th>\n",
       "      <th>s_ty_sum1344</th>\n",
       "      <th>s_ty_mean1344</th>\n",
       "      <th>et_c_sum1360</th>\n",
       "      <th>et_c_mean1360</th>\n",
       "      <th>et_c_sum1376</th>\n",
       "      <th>et_c_mean1376</th>\n",
       "      <th>sub__sum1424</th>\n",
       "      <th>sub__mean1424</th>\n",
       "      <th>sub__sum1440</th>\n",
       "      <th>sub__mean1440</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>1776471</td>\n",
       "      <td>5944872</td>\n",
       "      <td>540442.909091</td>\n",
       "      <td>800564.434720</td>\n",
       "      <td>1.214852</td>\n",
       "      <td>4.065442</td>\n",
       "      <td>0.369586</td>\n",
       "      <td>0.547472</td>\n",
       "      <td>28668.545455</td>\n",
       "      <td>...</td>\n",
       "      <td>8.778990e+07</td>\n",
       "      <td>1.097374e+07</td>\n",
       "      <td>1.007952e+08</td>\n",
       "      <td>1.259940e+07</td>\n",
       "      <td>3.134023e+06</td>\n",
       "      <td>3.917528e+05</td>\n",
       "      <td>32976.321279</td>\n",
       "      <td>4122.04016</td>\n",
       "      <td>609.613543</td>\n",
       "      <td>76.201693</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>3</td>\n",
       "      <td>1776471</td>\n",
       "      <td>7326370</td>\n",
       "      <td>348874.761905</td>\n",
       "      <td>608200.858921</td>\n",
       "      <td>1.214852</td>\n",
       "      <td>5.010189</td>\n",
       "      <td>0.238580</td>\n",
       "      <td>0.415922</td>\n",
       "      <td>28956.190476</td>\n",
       "      <td>...</td>\n",
       "      <td>7.728097e+08</td>\n",
       "      <td>9.660121e+07</td>\n",
       "      <td>2.021000e+09</td>\n",
       "      <td>2.526250e+08</td>\n",
       "      <td>6.409814e+07</td>\n",
       "      <td>8.012267e+06</td>\n",
       "      <td>98.000000</td>\n",
       "      <td>12.25000</td>\n",
       "      <td>28.000000</td>\n",
       "      <td>3.500000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>2 rows × 561 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   17opos_y  58opmode_uid_cnt_x  60opmode_uid_cnt_x  61opmode_uid_cnt_y  \\\n",
       "0         1             1776471             5944872       540442.909091   \n",
       "1         3             1776471             7326370       348874.761905   \n",
       "\n",
       "   62opmode_uid_cnt_x  66opmode_op_cnt_rate_x  68opmode_op_cnt_rate_x  \\\n",
       "0       800564.434720                1.214852                4.065442   \n",
       "1       608200.858921                1.214852                5.010189   \n",
       "\n",
       "   69opmode_op_cnt_rate_y  70opmode_op_cnt_rate_x  77opmode_uid_nunique_y  \\\n",
       "0                0.369586                0.547472            28668.545455   \n",
       "1                0.238580                0.415922            28956.190476   \n",
       "\n",
       "       ...        s_ty_sum1344  s_ty_mean1344  et_c_sum1360  et_c_mean1360  \\\n",
       "0      ...        8.778990e+07   1.097374e+07  1.007952e+08   1.259940e+07   \n",
       "1      ...        7.728097e+08   9.660121e+07  2.021000e+09   2.526250e+08   \n",
       "\n",
       "   et_c_sum1376  et_c_mean1376  sub__sum1424  sub__mean1424  sub__sum1440  \\\n",
       "0  3.134023e+06   3.917528e+05  32976.321279     4122.04016    609.613543   \n",
       "1  6.409814e+07   8.012267e+06     98.000000       12.25000     28.000000   \n",
       "\n",
       "   sub__mean1440  \n",
       "0      76.201693  \n",
       "1       3.500000  \n",
       "\n",
       "[2 rows x 561 columns]"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_data = pd.read_csv(features_base_path + \"test_data.csv\")\n",
    "train_data = pd.read_csv(features_base_path + \"train_data.csv\")\n",
    "train_data[tag_hd.UID] = label_train[tag_hd.UID]\n",
    "test_data.head(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "40\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>UID</th>\n",
       "      <th>ip1_uid_cnt35max</th>\n",
       "      <th>market_code_uid_cnt47max</th>\n",
       "      <th>ip1_sub_uid_cnt35max</th>\n",
       "      <th>os1max</th>\n",
       "      <th>ip1_sub_uid_nunique36max</th>\n",
       "      <th>wifi_uid_nunique32max</th>\n",
       "      <th>ip1_sub_uid_cnt51max</th>\n",
       "      <th>version_uid_cnt11max</th>\n",
       "      <th>ip1_sub_uid_nunique52max</th>\n",
       "      <th>...</th>\n",
       "      <th>merchant_uid_cnt15max</th>\n",
       "      <th>trans_amt_uid_nunique10max</th>\n",
       "      <th>merchant_uid_nunique16max</th>\n",
       "      <th>code2_uid_cnt19max</th>\n",
       "      <th>code2_uid_nunique20max</th>\n",
       "      <th>acc_id2_uid_nunique40max</th>\n",
       "      <th>acc_id3_uid_nunique42max</th>\n",
       "      <th>market_type5max</th>\n",
       "      <th>channel0max</th>\n",
       "      <th>success0max</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>30000</td>\n",
       "      <td>-1.256468</td>\n",
       "      <td>0.202362</td>\n",
       "      <td>-0.086747</td>\n",
       "      <td>0.770548</td>\n",
       "      <td>-0.007227</td>\n",
       "      <td>0.518077</td>\n",
       "      <td>-0.398855</td>\n",
       "      <td>0.949892</td>\n",
       "      <td>-0.271419</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.362604</td>\n",
       "      <td>0.097182</td>\n",
       "      <td>-0.78725</td>\n",
       "      <td>0.27324</td>\n",
       "      <td>0.266573</td>\n",
       "      <td>0.137326</td>\n",
       "      <td>0.237909</td>\n",
       "      <td>0.161111</td>\n",
       "      <td>-0.616196</td>\n",
       "      <td>0.017146</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>30001</td>\n",
       "      <td>-0.085291</td>\n",
       "      <td>0.202362</td>\n",
       "      <td>-0.601601</td>\n",
       "      <td>-0.232819</td>\n",
       "      <td>-0.856360</td>\n",
       "      <td>-0.707658</td>\n",
       "      <td>-1.034711</td>\n",
       "      <td>-0.429868</td>\n",
       "      <td>-1.042895</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.362604</td>\n",
       "      <td>-0.491100</td>\n",
       "      <td>-0.78725</td>\n",
       "      <td>0.27324</td>\n",
       "      <td>0.266573</td>\n",
       "      <td>0.137326</td>\n",
       "      <td>0.237909</td>\n",
       "      <td>0.161111</td>\n",
       "      <td>-0.616196</td>\n",
       "      <td>-0.363081</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>2 rows × 40 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "     UID  ip1_uid_cnt35max  market_code_uid_cnt47max  ip1_sub_uid_cnt35max  \\\n",
       "0  30000         -1.256468                  0.202362             -0.086747   \n",
       "1  30001         -0.085291                  0.202362             -0.601601   \n",
       "\n",
       "     os1max  ip1_sub_uid_nunique36max  wifi_uid_nunique32max  \\\n",
       "0  0.770548                 -0.007227               0.518077   \n",
       "1 -0.232819                 -0.856360              -0.707658   \n",
       "\n",
       "   ip1_sub_uid_cnt51max  version_uid_cnt11max  ip1_sub_uid_nunique52max  \\\n",
       "0             -0.398855              0.949892                 -0.271419   \n",
       "1             -1.034711             -0.429868                 -1.042895   \n",
       "\n",
       "      ...       merchant_uid_cnt15max  trans_amt_uid_nunique10max  \\\n",
       "0     ...                   -0.362604                    0.097182   \n",
       "1     ...                   -0.362604                   -0.491100   \n",
       "\n",
       "   merchant_uid_nunique16max  code2_uid_cnt19max  code2_uid_nunique20max  \\\n",
       "0                   -0.78725             0.27324                0.266573   \n",
       "1                   -0.78725             0.27324                0.266573   \n",
       "\n",
       "   acc_id2_uid_nunique40max  acc_id3_uid_nunique42max  market_type5max  \\\n",
       "0                  0.137326                  0.237909         0.161111   \n",
       "1                  0.137326                  0.237909         0.161111   \n",
       "\n",
       "   channel0max  success0max  \n",
       "0    -0.616196     0.017146  \n",
       "1    -0.616196    -0.363081  \n",
       "\n",
       "[2 rows x 40 columns]"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "op_train_weo_ftr = pd.read_csv(features_base_path+\"op_train_weo_ftr.csv\")\n",
    "# op_train_weo_ftr.pop(tag_hd.UID)\n",
    "trsct_train_weo_ftr = pd.read_csv(features_base_path+\"trsct_train_weo_ftr.csv\")\n",
    "# trsct_train_weo_ftr.pop(tag_hd.Tag)\n",
    "train = op_train_weo_ftr.merge(trsct_train_weo_ftr, on='UID', how='left')\n",
    "# train.pop(tag_hd.UID)\n",
    "cols = ['UID',\"ip1_uid_cnt35max\",\"market_code_uid_cnt47max\",\"ip1_sub_uid_cnt35max\",\"os1max\",\"ip1_sub_uid_nunique36max\",\"wifi_uid_nunique32max\",\"ip1_sub_uid_cnt51max\",\"version_uid_cnt11max\",\"ip1_sub_uid_nunique52max\",\"ip2_uid_cnt25max\",\"ip2_uid_nunique26max\",\"day1max\",\"day_uid_cnt6max\",\"device_code3_uid_nunique28max\",\"device1_uid_nunique14max\",\"device2_uid_nunique16max\",\"ip2_sub_uid_nunique38max\",\"mac1_uid_nunique22max\",\"device2_uid_cnt27max\",\"trans_amt_uid_cnt9max\",\"wifi_uid_cnt31max\",\"mac1_uid_cnt25max\",\"device_code1_uid_cnt17max\",\"device_code2_uid_cnt19max\",\"geocode_uid_cnt43max\",\"geocode_uid_nunique44max\",\"acc_id3_uid_cnt41max\",\"trans_type24max\",\"device_code3_uid_cnt27max\",\"merchant_uid_cnt15max\",\"trans_amt_uid_nunique10max\",\"merchant_uid_nunique16max\",\"code2_uid_cnt19max\",\"code2_uid_nunique20max\",\"acc_id2_uid_nunique40max\",\"acc_id3_uid_nunique42max\",\"market_type5max\",\"channel0max\",\"success0max\"]\n",
    "# [cols.remove(item) if 'Tag' in item else item for item in cols]\n",
    "print(len(cols))\n",
    "train = train[cols]\n",
    "\n",
    "op_test_weo_ftr = pd.read_csv(features_base_path+\"op_test_weo_ftr.csv\")\n",
    "trsct_test_weo_ftr = pd.read_csv(features_base_path+\"trsct_test_weo_ftr.csv\")\n",
    "test = op_test_weo_ftr.merge(trsct_test_weo_ftr, on='UID', how='left')\n",
    "# test.pop(tag_hd.UID)\n",
    "# train, label, cols = get_X_y_weo()\n",
    "test = test[cols]\n",
    "test.head(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>UID</th>\n",
       "      <th>ip1_uid_cnt35max</th>\n",
       "      <th>market_code_uid_cnt47max</th>\n",
       "      <th>ip1_sub_uid_cnt35max</th>\n",
       "      <th>os1max</th>\n",
       "      <th>ip1_sub_uid_nunique36max</th>\n",
       "      <th>wifi_uid_nunique32max</th>\n",
       "      <th>ip1_sub_uid_cnt51max</th>\n",
       "      <th>version_uid_cnt11max</th>\n",
       "      <th>ip1_sub_uid_nunique52max</th>\n",
       "      <th>...</th>\n",
       "      <th>s_ty_sum1344</th>\n",
       "      <th>s_ty_mean1344</th>\n",
       "      <th>et_c_sum1360</th>\n",
       "      <th>et_c_mean1360</th>\n",
       "      <th>et_c_sum1376</th>\n",
       "      <th>et_c_mean1376</th>\n",
       "      <th>sub__sum1424</th>\n",
       "      <th>sub__mean1424</th>\n",
       "      <th>sub__sum1440</th>\n",
       "      <th>sub__mean1440</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>10000</td>\n",
       "      <td>-0.671911</td>\n",
       "      <td>-0.216656</td>\n",
       "      <td>-0.601601</td>\n",
       "      <td>0.770548</td>\n",
       "      <td>-0.85636</td>\n",
       "      <td>0.518077</td>\n",
       "      <td>-1.034711</td>\n",
       "      <td>-0.429868</td>\n",
       "      <td>-1.042895</td>\n",
       "      <td>...</td>\n",
       "      <td>2.649330e+05</td>\n",
       "      <td>3.311662e+04</td>\n",
       "      <td>3.030000e+02</td>\n",
       "      <td>3.787500e+01</td>\n",
       "      <td>88.0000</td>\n",
       "      <td>11.000000</td>\n",
       "      <td>18.000000</td>\n",
       "      <td>2.250000</td>\n",
       "      <td>13.000000</td>\n",
       "      <td>1.625000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>10001</td>\n",
       "      <td>-0.671911</td>\n",
       "      <td>-0.216656</td>\n",
       "      <td>-0.601601</td>\n",
       "      <td>0.770548</td>\n",
       "      <td>-0.85636</td>\n",
       "      <td>0.518077</td>\n",
       "      <td>-1.034711</td>\n",
       "      <td>0.949892</td>\n",
       "      <td>-1.042895</td>\n",
       "      <td>...</td>\n",
       "      <td>1.814813e+08</td>\n",
       "      <td>2.268516e+07</td>\n",
       "      <td>1.379441e+07</td>\n",
       "      <td>1.724302e+06</td>\n",
       "      <td>184358.5269</td>\n",
       "      <td>23044.815863</td>\n",
       "      <td>1715.994547</td>\n",
       "      <td>214.499318</td>\n",
       "      <td>442.642824</td>\n",
       "      <td>55.330353</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>2 rows × 602 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "     UID  ip1_uid_cnt35max  market_code_uid_cnt47max  ip1_sub_uid_cnt35max  \\\n",
       "0  10000         -0.671911                 -0.216656             -0.601601   \n",
       "1  10001         -0.671911                 -0.216656             -0.601601   \n",
       "\n",
       "     os1max  ip1_sub_uid_nunique36max  wifi_uid_nunique32max  \\\n",
       "0  0.770548                  -0.85636               0.518077   \n",
       "1  0.770548                  -0.85636               0.518077   \n",
       "\n",
       "   ip1_sub_uid_cnt51max  version_uid_cnt11max  ip1_sub_uid_nunique52max  \\\n",
       "0             -1.034711             -0.429868                 -1.042895   \n",
       "1             -1.034711              0.949892                 -1.042895   \n",
       "\n",
       "       ...        s_ty_sum1344  s_ty_mean1344  et_c_sum1360  et_c_mean1360  \\\n",
       "0      ...        2.649330e+05   3.311662e+04  3.030000e+02   3.787500e+01   \n",
       "1      ...        1.814813e+08   2.268516e+07  1.379441e+07   1.724302e+06   \n",
       "\n",
       "   et_c_sum1376  et_c_mean1376  sub__sum1424  sub__mean1424  sub__sum1440  \\\n",
       "0       88.0000      11.000000     18.000000       2.250000     13.000000   \n",
       "1   184358.5269   23044.815863   1715.994547     214.499318    442.642824   \n",
       "\n",
       "   sub__mean1440  \n",
       "0       1.625000  \n",
       "1      55.330353  \n",
       "\n",
       "[2 rows x 602 columns]"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_data = train.merge(train_data, on='UID', how='left') \n",
    "train_data.head(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "123\n",
      "(602, 2)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Tag</th>\n",
       "      <th>index</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>40</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>Tag</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>300</th>\n",
       "      <td>0.424501</td>\n",
       "      <td>code1_uid_nunique_x.3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>290</th>\n",
       "      <td>0.424475</td>\n",
       "      <td>code1_uid_cnt_x.3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>305</th>\n",
       "      <td>0.424475</td>\n",
       "      <td>code1_trsct_nunique_rate_x.3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>295</th>\n",
       "      <td>0.424475</td>\n",
       "      <td>code1_trsct_cnt_rate_x.3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>560</th>\n",
       "      <td>0.415450</td>\n",
       "      <td>1_ui_sum896</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>561</th>\n",
       "      <td>0.415450</td>\n",
       "      <td>1_ui_mean896</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>301</th>\n",
       "      <td>0.414832</td>\n",
       "      <td>code1_uid_nunique_y.3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>558</th>\n",
       "      <td>0.414790</td>\n",
       "      <td>1_ui_sum880</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>559</th>\n",
       "      <td>0.414790</td>\n",
       "      <td>1_ui_mean880</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>306</th>\n",
       "      <td>0.414666</td>\n",
       "      <td>code1_trsct_nunique_rate_y.3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>291</th>\n",
       "      <td>0.414666</td>\n",
       "      <td>code1_uid_cnt_y.3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>296</th>\n",
       "      <td>0.414666</td>\n",
       "      <td>code1_trsct_cnt_rate_y.3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>297</th>\n",
       "      <td>0.326350</td>\n",
       "      <td>code1_uid_nunique_y</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>429</th>\n",
       "      <td>0.324214</td>\n",
       "      <td>ip1_uid_nunique_x.1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>281</th>\n",
       "      <td>0.315827</td>\n",
       "      <td>merchant_uid_nunique_y</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>432</th>\n",
       "      <td>0.312808</td>\n",
       "      <td>ip1_uid_nunique_y.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>333</th>\n",
       "      <td>0.312059</td>\n",
       "      <td>acc_id1_trsct_cnt_rate_x.3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>329</th>\n",
       "      <td>0.312059</td>\n",
       "      <td>acc_id1_uid_cnt_x.3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>341</th>\n",
       "      <td>0.312059</td>\n",
       "      <td>acc_id1_trsct_nunique_rate_x.3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>337</th>\n",
       "      <td>0.304446</td>\n",
       "      <td>acc_id1_uid_nunique_x.3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>335</th>\n",
       "      <td>0.293726</td>\n",
       "      <td>acc_id1_uid_nunique_y</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>342</th>\n",
       "      <td>0.291091</td>\n",
       "      <td>acc_id1_trsct_nunique_rate_y.3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>334</th>\n",
       "      <td>0.291091</td>\n",
       "      <td>acc_id1_trsct_cnt_rate_y.3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>330</th>\n",
       "      <td>0.291091</td>\n",
       "      <td>acc_id1_uid_cnt_y.3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>275</th>\n",
       "      <td>0.290949</td>\n",
       "      <td>merchant_uid_cnt_y</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>278</th>\n",
       "      <td>0.290949</td>\n",
       "      <td>merchant_trsct_cnt_rate_y</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>284</th>\n",
       "      <td>0.290949</td>\n",
       "      <td>merchant_trsct_nunique_rate_y</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>338</th>\n",
       "      <td>0.289693</td>\n",
       "      <td>acc_id1_uid_nunique_y.3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>565</th>\n",
       "      <td>0.289485</td>\n",
       "      <td>id1__mean992</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>468</th>\n",
       "      <td>-0.327363</td>\n",
       "      <td>trans_type2_uid_cnt_y.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>486</th>\n",
       "      <td>-0.327363</td>\n",
       "      <td>trans_type2_trsct_nunique_rate_y.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>474</th>\n",
       "      <td>-0.327363</td>\n",
       "      <td>trans_type2_trsct_cnt_rate_y.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>480</th>\n",
       "      <td>-0.327931</td>\n",
       "      <td>trans_type2_uid_nunique_y.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>248</th>\n",
       "      <td>-0.340312</td>\n",
       "      <td>channel_uid_nunique_y.1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>409</th>\n",
       "      <td>-0.369987</td>\n",
       "      <td>bal_uid_nunique_y.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>403</th>\n",
       "      <td>-0.370283</td>\n",
       "      <td>bal_trsct_cnt_rate_y.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>415</th>\n",
       "      <td>-0.370283</td>\n",
       "      <td>bal_trsct_nunique_rate_y.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>397</th>\n",
       "      <td>-0.370283</td>\n",
       "      <td>bal_uid_cnt_y.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>322</th>\n",
       "      <td>-0.372296</td>\n",
       "      <td>trans_type1_uid_nunique_y.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>318</th>\n",
       "      <td>-0.376659</td>\n",
       "      <td>trans_type1_trsct_cnt_rate_y.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>314</th>\n",
       "      <td>-0.376659</td>\n",
       "      <td>trans_type1_uid_cnt_y.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>326</th>\n",
       "      <td>-0.376659</td>\n",
       "      <td>trans_type1_trsct_nunique_rate_y.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>224</th>\n",
       "      <td>-0.379687</td>\n",
       "      <td>channel_y.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>236</th>\n",
       "      <td>-0.381351</td>\n",
       "      <td>channel_uid_cnt_y.1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>242</th>\n",
       "      <td>-0.381351</td>\n",
       "      <td>channel_trsct_cnt_rate_y.1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>254</th>\n",
       "      <td>-0.381351</td>\n",
       "      <td>channel_trsct_nunique_rate_y.1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>316</th>\n",
       "      <td>-0.414060</td>\n",
       "      <td>trans_type1_trsct_cnt_rate_x.1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>324</th>\n",
       "      <td>-0.414060</td>\n",
       "      <td>trans_type1_trsct_nunique_rate_x.1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>312</th>\n",
       "      <td>-0.414060</td>\n",
       "      <td>trans_type1_uid_cnt_x.1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>320</th>\n",
       "      <td>-0.415260</td>\n",
       "      <td>trans_type1_uid_nunique_x.1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>249</th>\n",
       "      <td>-0.444849</td>\n",
       "      <td>channel_uid_nunique_y.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>222</th>\n",
       "      <td>-0.458444</td>\n",
       "      <td>channel_x.1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>255</th>\n",
       "      <td>-0.463848</td>\n",
       "      <td>channel_trsct_nunique_rate_y.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>243</th>\n",
       "      <td>-0.463848</td>\n",
       "      <td>channel_trsct_cnt_rate_y.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>237</th>\n",
       "      <td>-0.463848</td>\n",
       "      <td>channel_uid_cnt_y.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>253</th>\n",
       "      <td>-0.491880</td>\n",
       "      <td>channel_trsct_nunique_rate_x.1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>241</th>\n",
       "      <td>-0.491880</td>\n",
       "      <td>channel_trsct_cnt_rate_x.1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>235</th>\n",
       "      <td>-0.491880</td>\n",
       "      <td>channel_uid_cnt_x.1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>247</th>\n",
       "      <td>-0.494036</td>\n",
       "      <td>channel_uid_nunique_x.1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>602 rows × 2 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "          Tag                               index\n",
       "40   1.000000                                 Tag\n",
       "300  0.424501               code1_uid_nunique_x.3\n",
       "290  0.424475                   code1_uid_cnt_x.3\n",
       "305  0.424475        code1_trsct_nunique_rate_x.3\n",
       "295  0.424475            code1_trsct_cnt_rate_x.3\n",
       "560  0.415450                         1_ui_sum896\n",
       "561  0.415450                        1_ui_mean896\n",
       "301  0.414832               code1_uid_nunique_y.3\n",
       "558  0.414790                         1_ui_sum880\n",
       "559  0.414790                        1_ui_mean880\n",
       "306  0.414666        code1_trsct_nunique_rate_y.3\n",
       "291  0.414666                   code1_uid_cnt_y.3\n",
       "296  0.414666            code1_trsct_cnt_rate_y.3\n",
       "297  0.326350                 code1_uid_nunique_y\n",
       "429  0.324214                 ip1_uid_nunique_x.1\n",
       "281  0.315827              merchant_uid_nunique_y\n",
       "432  0.312808                 ip1_uid_nunique_y.2\n",
       "333  0.312059          acc_id1_trsct_cnt_rate_x.3\n",
       "329  0.312059                 acc_id1_uid_cnt_x.3\n",
       "341  0.312059      acc_id1_trsct_nunique_rate_x.3\n",
       "337  0.304446             acc_id1_uid_nunique_x.3\n",
       "335  0.293726               acc_id1_uid_nunique_y\n",
       "342  0.291091      acc_id1_trsct_nunique_rate_y.3\n",
       "334  0.291091          acc_id1_trsct_cnt_rate_y.3\n",
       "330  0.291091                 acc_id1_uid_cnt_y.3\n",
       "275  0.290949                  merchant_uid_cnt_y\n",
       "278  0.290949           merchant_trsct_cnt_rate_y\n",
       "284  0.290949       merchant_trsct_nunique_rate_y\n",
       "338  0.289693             acc_id1_uid_nunique_y.3\n",
       "565  0.289485                        id1__mean992\n",
       "..        ...                                 ...\n",
       "468 -0.327363             trans_type2_uid_cnt_y.2\n",
       "486 -0.327363  trans_type2_trsct_nunique_rate_y.2\n",
       "474 -0.327363      trans_type2_trsct_cnt_rate_y.2\n",
       "480 -0.327931         trans_type2_uid_nunique_y.2\n",
       "248 -0.340312             channel_uid_nunique_y.1\n",
       "409 -0.369987                 bal_uid_nunique_y.2\n",
       "403 -0.370283              bal_trsct_cnt_rate_y.2\n",
       "415 -0.370283          bal_trsct_nunique_rate_y.2\n",
       "397 -0.370283                     bal_uid_cnt_y.2\n",
       "322 -0.372296         trans_type1_uid_nunique_y.2\n",
       "318 -0.376659      trans_type1_trsct_cnt_rate_y.2\n",
       "314 -0.376659             trans_type1_uid_cnt_y.2\n",
       "326 -0.376659  trans_type1_trsct_nunique_rate_y.2\n",
       "224 -0.379687                         channel_y.2\n",
       "236 -0.381351                 channel_uid_cnt_y.1\n",
       "242 -0.381351          channel_trsct_cnt_rate_y.1\n",
       "254 -0.381351      channel_trsct_nunique_rate_y.1\n",
       "316 -0.414060      trans_type1_trsct_cnt_rate_x.1\n",
       "324 -0.414060  trans_type1_trsct_nunique_rate_x.1\n",
       "312 -0.414060             trans_type1_uid_cnt_x.1\n",
       "320 -0.415260         trans_type1_uid_nunique_x.1\n",
       "249 -0.444849             channel_uid_nunique_y.2\n",
       "222 -0.458444                         channel_x.1\n",
       "255 -0.463848      channel_trsct_nunique_rate_y.2\n",
       "243 -0.463848          channel_trsct_cnt_rate_y.2\n",
       "237 -0.463848                 channel_uid_cnt_y.2\n",
       "253 -0.491880      channel_trsct_nunique_rate_x.1\n",
       "241 -0.491880          channel_trsct_cnt_rate_x.1\n",
       "235 -0.491880                 channel_uid_cnt_x.1\n",
       "247 -0.494036             channel_uid_nunique_x.1\n",
       "\n",
       "[602 rows x 2 columns]"
      ]
     },
     "execution_count": 71,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "print(123)\n",
    "tr_corr = train_data.corr()['Tag'].reset_index()\n",
    "tr_corr = tr_corr[['Tag','index']].sort_values(by=['Tag'], ascending=False)\n",
    "print(tr_corr.shape) \n",
    "tr_corr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'tr_corr' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-7-e05f187a981d>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mtr_corr\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcolumns\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m[\u001b[0m\u001b[1;34m'Tag'\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;34m'index'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m      2\u001b[0m \u001b[0mcol\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mtr_corr\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mtr_corr\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'Tag'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mabs\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m>=\u001b[0m \u001b[1;36m0.01\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'index'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      3\u001b[0m \u001b[0mtrain_data\u001b[0m\u001b[1;33m=\u001b[0m \u001b[0mtrain_data\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mcol\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      4\u001b[0m \u001b[0mtrain_data\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mhead\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mNameError\u001b[0m: name 'tr_corr' is not defined"
     ]
    }
   ],
   "source": [
    "tr_corr.columns = ['Tag','index']\n",
    "col = tr_corr[tr_corr['Tag'].abs() >= 0.01]['index']\n",
    "train_data= train_data[col]\n",
    "train_data.head(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>UID</th>\n",
       "      <th>ip1_uid_cnt35max</th>\n",
       "      <th>market_code_uid_cnt47max</th>\n",
       "      <th>ip1_sub_uid_cnt35max</th>\n",
       "      <th>os1max</th>\n",
       "      <th>ip1_sub_uid_nunique36max</th>\n",
       "      <th>wifi_uid_nunique32max</th>\n",
       "      <th>ip1_sub_uid_cnt51max</th>\n",
       "      <th>version_uid_cnt11max</th>\n",
       "      <th>ip1_sub_uid_nunique52max</th>\n",
       "      <th>...</th>\n",
       "      <th>s_ty_sum1344</th>\n",
       "      <th>s_ty_mean1344</th>\n",
       "      <th>et_c_sum1360</th>\n",
       "      <th>et_c_mean1360</th>\n",
       "      <th>et_c_sum1376</th>\n",
       "      <th>et_c_mean1376</th>\n",
       "      <th>sub__sum1424</th>\n",
       "      <th>sub__mean1424</th>\n",
       "      <th>sub__sum1440</th>\n",
       "      <th>sub__mean1440</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>30000</td>\n",
       "      <td>-1.256468</td>\n",
       "      <td>0.202362</td>\n",
       "      <td>-0.086747</td>\n",
       "      <td>0.770548</td>\n",
       "      <td>-0.007227</td>\n",
       "      <td>0.518077</td>\n",
       "      <td>-0.398855</td>\n",
       "      <td>0.949892</td>\n",
       "      <td>-0.271419</td>\n",
       "      <td>...</td>\n",
       "      <td>8.778990e+07</td>\n",
       "      <td>1.097374e+07</td>\n",
       "      <td>1.007952e+08</td>\n",
       "      <td>1.259940e+07</td>\n",
       "      <td>3.134023e+06</td>\n",
       "      <td>3.917528e+05</td>\n",
       "      <td>32976.321279</td>\n",
       "      <td>4122.04016</td>\n",
       "      <td>609.613543</td>\n",
       "      <td>76.201693</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>30001</td>\n",
       "      <td>-0.085291</td>\n",
       "      <td>0.202362</td>\n",
       "      <td>-0.601601</td>\n",
       "      <td>-0.232819</td>\n",
       "      <td>-0.856360</td>\n",
       "      <td>-0.707658</td>\n",
       "      <td>-1.034711</td>\n",
       "      <td>-0.429868</td>\n",
       "      <td>-1.042895</td>\n",
       "      <td>...</td>\n",
       "      <td>7.728097e+08</td>\n",
       "      <td>9.660121e+07</td>\n",
       "      <td>2.021000e+09</td>\n",
       "      <td>2.526250e+08</td>\n",
       "      <td>6.409814e+07</td>\n",
       "      <td>8.012267e+06</td>\n",
       "      <td>98.000000</td>\n",
       "      <td>12.25000</td>\n",
       "      <td>28.000000</td>\n",
       "      <td>3.500000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>2 rows × 601 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "     UID  ip1_uid_cnt35max  market_code_uid_cnt47max  ip1_sub_uid_cnt35max  \\\n",
       "0  30000         -1.256468                  0.202362             -0.086747   \n",
       "1  30001         -0.085291                  0.202362             -0.601601   \n",
       "\n",
       "     os1max  ip1_sub_uid_nunique36max  wifi_uid_nunique32max  \\\n",
       "0  0.770548                 -0.007227               0.518077   \n",
       "1 -0.232819                 -0.856360              -0.707658   \n",
       "\n",
       "   ip1_sub_uid_cnt51max  version_uid_cnt11max  ip1_sub_uid_nunique52max  \\\n",
       "0             -0.398855              0.949892                 -0.271419   \n",
       "1             -1.034711             -0.429868                 -1.042895   \n",
       "\n",
       "       ...        s_ty_sum1344  s_ty_mean1344  et_c_sum1360  et_c_mean1360  \\\n",
       "0      ...        8.778990e+07   1.097374e+07  1.007952e+08   1.259940e+07   \n",
       "1      ...        7.728097e+08   9.660121e+07  2.021000e+09   2.526250e+08   \n",
       "\n",
       "   et_c_sum1376  et_c_mean1376  sub__sum1424  sub__mean1424  sub__sum1440  \\\n",
       "0  3.134023e+06   3.917528e+05  32976.321279     4122.04016    609.613543   \n",
       "1  6.409814e+07   8.012267e+06     98.000000       12.25000     28.000000   \n",
       "\n",
       "   sub__mean1440  \n",
       "0      76.201693  \n",
       "1       3.500000  \n",
       "\n",
       "[2 rows x 601 columns]"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# test_data[tag_hd.UID] = label_test[tag_hd.UID]\n",
    "# # test_data = test.merge(test_data, on='UID', how='left') \n",
    "# y = label_train[tag_hd.Tag]\n",
    "# train_data= train_data[col]\n",
    "# train_data[tag_hd.Tag]= y\n",
    "# test_data = test_data[col]\n",
    "# print(train_data.shape)\n",
    "# print(test_data.shape)\n",
    "train_data.to_csv(features_base_path + \"train_ftr.csv\", index=False)\n",
    "test_data.to_csv(features_base_path + \"test_ftr.csv\", index=False)\n",
    "test_data.head(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(31179, 713)\n",
      "(31198, 712)\n",
      "712\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>index</th>\n",
       "      <th>Tag</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   index  Tag\n",
       "0      0    1\n",
       "1      1    0"
      ]
     },
     "execution_count": 76,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "print(train_data.shape)\n",
    "print(test_data.shape)\n",
    "print(len(col))\n",
    "train_data[tag_hd.Tag].reset_index().head(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>UID_0</th>\n",
       "      <th>Tag_1</th>\n",
       "      <th>mode_x_2</th>\n",
       "      <th>mode_y_3</th>\n",
       "      <th>success_x_4</th>\n",
       "      <th>success_y_5</th>\n",
       "      <th>time_x_6</th>\n",
       "      <th>time_y_7</th>\n",
       "      <th>os_x_8</th>\n",
       "      <th>os_y_9</th>\n",
       "      <th>...</th>\n",
       "      <th>market_code_x_102</th>\n",
       "      <th>market_code_y_103</th>\n",
       "      <th>market_type_x_104</th>\n",
       "      <th>market_type_y_105</th>\n",
       "      <th>market_type_x_106</th>\n",
       "      <th>market_type_y_107</th>\n",
       "      <th>market_type_x_108</th>\n",
       "      <th>market_type_y_109</th>\n",
       "      <th>market_type_110</th>\n",
       "      <th>ip1_sub_y_112</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>10000</td>\n",
       "      <td>1</td>\n",
       "      <td>9.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>9.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>9.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>9.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.649576</td>\n",
       "      <td>1.573097</td>\n",
       "      <td>5.905078</td>\n",
       "      <td>1.608176</td>\n",
       "      <td>0.052341</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>10001</td>\n",
       "      <td>0</td>\n",
       "      <td>67.0</td>\n",
       "      <td>6.0</td>\n",
       "      <td>50.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>67.0</td>\n",
       "      <td>55.0</td>\n",
       "      <td>67.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>...</td>\n",
       "      <td>3.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>9.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>2 rows × 104 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   UID_0  Tag_1  mode_x_2  mode_y_3  success_x_4  success_y_5  time_x_6  \\\n",
       "0  10000      1       9.0       3.0          9.0          1.0       9.0   \n",
       "1  10001      0      67.0       6.0         50.0          2.0      67.0   \n",
       "\n",
       "   time_y_7  os_x_8  os_y_9      ...        market_code_x_102  \\\n",
       "0       5.0     9.0     1.0      ...                      0.0   \n",
       "1      55.0    67.0     3.0      ...                      3.0   \n",
       "\n",
       "   market_code_y_103  market_type_x_104  market_type_y_105  market_type_x_106  \\\n",
       "0                0.0                0.0                0.0           1.649576   \n",
       "1                3.0                3.0                1.0           1.000000   \n",
       "\n",
       "   market_type_y_107  market_type_x_108  market_type_y_109  market_type_110  \\\n",
       "0           1.573097           5.905078           1.608176         0.052341   \n",
       "1           1.000000           3.000000           1.000000         0.000000   \n",
       "\n",
       "   ip1_sub_y_112  \n",
       "0            1.0  \n",
       "1            9.0  \n",
       "\n",
       "[2 rows x 104 columns]"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "col = tr_corr[tr_corr['Tag_1'].abs()>0.01]['index']\n",
    "train_data = train[col]\n",
    "test_data = test[col]\n",
    "train_data.head(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "123\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>UID_0</th>\n",
       "      <th>Tag_1</th>\n",
       "      <th>mode_x_2</th>\n",
       "      <th>mode_y_3</th>\n",
       "      <th>success_x_4</th>\n",
       "      <th>success_y_5</th>\n",
       "      <th>time_x_6</th>\n",
       "      <th>time_y_7</th>\n",
       "      <th>os_x_8</th>\n",
       "      <th>os_y_9</th>\n",
       "      <th>...</th>\n",
       "      <th>market_code_x_102</th>\n",
       "      <th>market_code_y_103</th>\n",
       "      <th>market_type_x_104</th>\n",
       "      <th>market_type_y_105</th>\n",
       "      <th>market_type_x_106</th>\n",
       "      <th>market_type_y_107</th>\n",
       "      <th>market_type_x_108</th>\n",
       "      <th>market_type_y_109</th>\n",
       "      <th>market_type_110</th>\n",
       "      <th>ip1_sub_y_112</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>30000</td>\n",
       "      <td>0.5</td>\n",
       "      <td>11.0</td>\n",
       "      <td>9.0</td>\n",
       "      <td>11.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>11.0</td>\n",
       "      <td>9.0</td>\n",
       "      <td>11.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.645623</td>\n",
       "      <td>1.536406</td>\n",
       "      <td>3.515572</td>\n",
       "      <td>1.587047</td>\n",
       "      <td>0.128132</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>30001</td>\n",
       "      <td>0.5</td>\n",
       "      <td>21.0</td>\n",
       "      <td>10.0</td>\n",
       "      <td>21.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>21.0</td>\n",
       "      <td>14.0</td>\n",
       "      <td>21.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>...</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.128132</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>2 rows × 104 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   UID_0  Tag_1  mode_x_2  mode_y_3  success_x_4  success_y_5  time_x_6  \\\n",
       "0  30000    0.5      11.0       9.0         11.0          1.0      11.0   \n",
       "1  30001    0.5      21.0      10.0         21.0          2.0      21.0   \n",
       "\n",
       "   time_y_7  os_x_8  os_y_9      ...        market_code_x_102  \\\n",
       "0       9.0    11.0     1.0      ...                      0.0   \n",
       "1      14.0    21.0     3.0      ...                      1.0   \n",
       "\n",
       "   market_code_y_103  market_type_x_104  market_type_y_105  market_type_x_106  \\\n",
       "0                0.0                0.0                0.0           1.645623   \n",
       "1                1.0                1.0                1.0           1.000000   \n",
       "\n",
       "   market_type_y_107  market_type_x_108  market_type_y_109  market_type_110  \\\n",
       "0           1.536406           3.515572           1.587047         0.128132   \n",
       "1           1.000000           1.000000           1.000000         0.128132   \n",
       "\n",
       "   ip1_sub_y_112  \n",
       "0            1.0  \n",
       "1            1.0  \n",
       "\n",
       "[2 rows x 104 columns]"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.to_pickle(train_data,features_base_path+\"train_data.pkl\")\n",
    "pd.to_pickle(test_data,features_base_path+\"test_data.pkl\")\n",
    "print(123)\n",
    "test_data.head(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "ename": "KeyError",
     "evalue": "'Tag_1'",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mKeyError\u001b[0m                                  Traceback (most recent call last)",
      "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\pandas\\core\\indexes\\base.py\u001b[0m in \u001b[0;36mget_loc\u001b[1;34m(self, key, method, tolerance)\u001b[0m\n\u001b[0;32m   2441\u001b[0m             \u001b[1;32mtry\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 2442\u001b[1;33m                 \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_engine\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m   2443\u001b[0m             \u001b[1;32mexcept\u001b[0m \u001b[0mKeyError\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mpandas\\_libs\\index.pyx\u001b[0m in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc (pandas\\_libs\\index.c:5280)\u001b[1;34m()\u001b[0m\n",
      "\u001b[1;32mpandas\\_libs\\index.pyx\u001b[0m in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc (pandas\\_libs\\index.c:5126)\u001b[1;34m()\u001b[0m\n",
      "\u001b[1;32mpandas\\_libs\\hashtable_class_helper.pxi\u001b[0m in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item (pandas\\_libs\\hashtable.c:20523)\u001b[1;34m()\u001b[0m\n",
      "\u001b[1;32mpandas\\_libs\\hashtable_class_helper.pxi\u001b[0m in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item (pandas\\_libs\\hashtable.c:20477)\u001b[1;34m()\u001b[0m\n",
      "\u001b[1;31mKeyError\u001b[0m: 'Tag_1'",
      "\nDuring handling of the above exception, another exception occurred:\n",
      "\u001b[1;31mKeyError\u001b[0m                                  Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-54-176915e6ee5f>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0my\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mtrain_data\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'Tag_1'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m      2\u001b[0m \u001b[0mtrain_data\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpop\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'Tag_1'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      3\u001b[0m \u001b[1;31m# train.pop('UID')\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      4\u001b[0m \u001b[0mX\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mtrain_data\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      5\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m123\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\pandas\\core\\frame.py\u001b[0m in \u001b[0;36m__getitem__\u001b[1;34m(self, key)\u001b[0m\n\u001b[0;32m   1962\u001b[0m             \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_getitem_multilevel\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1963\u001b[0m         \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1964\u001b[1;33m             \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_getitem_column\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m   1965\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1966\u001b[0m     \u001b[1;32mdef\u001b[0m \u001b[0m_getitem_column\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\pandas\\core\\frame.py\u001b[0m in \u001b[0;36m_getitem_column\u001b[1;34m(self, key)\u001b[0m\n\u001b[0;32m   1969\u001b[0m         \u001b[1;31m# get column\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1970\u001b[0m         \u001b[1;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mis_unique\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1971\u001b[1;33m             \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_get_item_cache\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m   1972\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1973\u001b[0m         \u001b[1;31m# duplicate columns & possible reduce dimensionality\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\pandas\\core\\generic.py\u001b[0m in \u001b[0;36m_get_item_cache\u001b[1;34m(self, item)\u001b[0m\n\u001b[0;32m   1643\u001b[0m         \u001b[0mres\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mcache\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mitem\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1644\u001b[0m         \u001b[1;32mif\u001b[0m \u001b[0mres\u001b[0m \u001b[1;32mis\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1645\u001b[1;33m             \u001b[0mvalues\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_data\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mitem\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m   1646\u001b[0m             \u001b[0mres\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_box_item_values\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mitem\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mvalues\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1647\u001b[0m             \u001b[0mcache\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mitem\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mres\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\pandas\\core\\internals.py\u001b[0m in \u001b[0;36mget\u001b[1;34m(self, item, fastpath)\u001b[0m\n\u001b[0;32m   3588\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   3589\u001b[0m             \u001b[1;32mif\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[0misnull\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mitem\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 3590\u001b[1;33m                 \u001b[0mloc\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mitems\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mitem\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m   3591\u001b[0m             \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   3592\u001b[0m                 \u001b[0mindexer\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0marange\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mitems\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0misnull\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mitems\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\pandas\\core\\indexes\\base.py\u001b[0m in \u001b[0;36mget_loc\u001b[1;34m(self, key, method, tolerance)\u001b[0m\n\u001b[0;32m   2442\u001b[0m                 \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_engine\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   2443\u001b[0m             \u001b[1;32mexcept\u001b[0m \u001b[0mKeyError\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 2444\u001b[1;33m                 \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_engine\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_maybe_cast_indexer\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m   2445\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   2446\u001b[0m         \u001b[0mindexer\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_indexer\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mmethod\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mmethod\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mtolerance\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mtolerance\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mpandas\\_libs\\index.pyx\u001b[0m in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc (pandas\\_libs\\index.c:5280)\u001b[1;34m()\u001b[0m\n",
      "\u001b[1;32mpandas\\_libs\\index.pyx\u001b[0m in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc (pandas\\_libs\\index.c:5126)\u001b[1;34m()\u001b[0m\n",
      "\u001b[1;32mpandas\\_libs\\hashtable_class_helper.pxi\u001b[0m in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item (pandas\\_libs\\hashtable.c:20523)\u001b[1;34m()\u001b[0m\n",
      "\u001b[1;32mpandas\\_libs\\hashtable_class_helper.pxi\u001b[0m in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item (pandas\\_libs\\hashtable.c:20477)\u001b[1;34m()\u001b[0m\n",
      "\u001b[1;31mKeyError\u001b[0m: 'Tag_1'"
     ]
    }
   ],
   "source": [
    "y = train_data['Tag_1'].values\n",
    "train_data.pop('Tag_1')\n",
    "# train.pop('UID')\n",
    "X = train_data.values\n",
    "print(123)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>mode_y_3</th>\n",
       "      <th>device1_y_13</th>\n",
       "      <th>device_code1_y_17</th>\n",
       "      <th>device_code2_y_19</th>\n",
       "      <th>device_code3_y_21</th>\n",
       "      <th>mac2_x_24</th>\n",
       "      <th>ip1_y_27</th>\n",
       "      <th>wifi_x_30</th>\n",
       "      <th>wifi_y_31</th>\n",
       "      <th>geo_code_x_32</th>\n",
       "      <th>...</th>\n",
       "      <th>trans_type2_y_96</th>\n",
       "      <th>trans_type2_x_97</th>\n",
       "      <th>trans_type2_y_98</th>\n",
       "      <th>trans_type2_y_100</th>\n",
       "      <th>trans_type2_101</th>\n",
       "      <th>market_type_y_105</th>\n",
       "      <th>market_type_x_106</th>\n",
       "      <th>market_type_y_107</th>\n",
       "      <th>market_type_y_109</th>\n",
       "      <th>market_type_110</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>3.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>1.0</td>\n",
       "      <td>105.0</td>\n",
       "      <td>105.0</td>\n",
       "      <td>105.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.649576</td>\n",
       "      <td>1.573097</td>\n",
       "      <td>1.608176</td>\n",
       "      <td>0.052341</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>6.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>43.0</td>\n",
       "      <td>9.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>48.0</td>\n",
       "      <td>...</td>\n",
       "      <td>2.0</td>\n",
       "      <td>105.0</td>\n",
       "      <td>102.0</td>\n",
       "      <td>102.666667</td>\n",
       "      <td>1.283378</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>2 rows × 35 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   mode_y_3  device1_y_13  device_code1_y_17  device_code2_y_19  \\\n",
       "0       3.0           1.0                0.0                0.0   \n",
       "1       6.0           2.0                1.0                2.0   \n",
       "\n",
       "   device_code3_y_21  mac2_x_24  ip1_y_27  wifi_x_30  wifi_y_31  \\\n",
       "0                1.0        0.0       2.0        0.0        0.0   \n",
       "1                1.0       43.0       9.0        2.0        1.0   \n",
       "\n",
       "   geo_code_x_32       ...         trans_type2_y_96  trans_type2_x_97  \\\n",
       "0            0.0       ...                      1.0             105.0   \n",
       "1           48.0       ...                      2.0             105.0   \n",
       "\n",
       "   trans_type2_y_98  trans_type2_y_100  trans_type2_101  market_type_y_105  \\\n",
       "0             105.0         105.000000         0.000000                0.0   \n",
       "1             102.0         102.666667         1.283378                1.0   \n",
       "\n",
       "   market_type_x_106  market_type_y_107  market_type_y_109  market_type_110  \n",
       "0           1.649576           1.573097           1.608176         0.052341  \n",
       "1           1.000000           1.000000           1.000000         0.000000  \n",
       "\n",
       "[2 rows x 35 columns]"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train.head(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0.7342762756983867, 0.5419352769492286, 0.5426408800795407, 0.6717662529266494, 0.6770582764039899, 0.6187818724141249, 0.5892106866801373, 0.6784374097950544, 0.6934475127489657, 0.6534526444080951, 0.6646140030148497, 0.6942493344879567, 0.7762596619519548, 0.8000256582956478, 0.7832836203855159, 0.767086821257898, 0.7420379101318195, 0.7459187273485359, 0.7345649315244235, 0.7722505532569999, 0.7777991596908176, 0.8511177395041535, 0.6345296513679078, 0.8085570415985118, 0.8317777991596909, 0.8534590589820071, 0.8138169922062927, 0.5976779242438821, 0.5941178357227621, 0.8405978382885917, 0.8238237275089002, 0.8288912408993233, 0.875621411847718, 0.8784758972385259, 0.42031495557907567, 0.8624715353282658, 0.5917123705057892, 0.7738541967349819, 0.8881939767150967, 0.5449821995573944, 0.6661214278841529, 0.32496231437826745, 0.24263125821867282, 0.4756406555694538, 0.8319381635074891, 0.8191410885531929, 0.885948875845922, 0.8387696847236922, 0.7639757529106129, 0.5922576092883031, 0.7226979697873569, 0.8898617659321979, 0.8847621796722153, 0.6342730684114307, 0.8424580647230507, 0.8822604958465634, 0.6261907052824016, 0.8702331697616986, 0.5175598960839026, 0.8739536226306167, 0.649732191539177, 0.6169857917187851, 0.5361942332980532, 0.7997049296000514]\n",
      "51\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n"
     ]
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "from sklearn.svm import LinearSVC\n",
    "from imblearn.over_sampling import RandomOverSampler\n",
    "from imblearn.under_sampling import RandomUnderSampler \n",
    "import numpy as np\n",
    "from collections import Counter\n",
    "import seaborn as sns\n",
    "def learning_curve(X, y, observations=range(1, 65)):\n",
    "    scores = []\n",
    "    for n in observations:\n",
    "        rus = RandomUnderSampler(random_state=0, ratio={0: n, 1: n})\n",
    "        rus.fit(X, y)\n",
    "        X_resampled, y_resampled = rus.sample(X, y)\n",
    "        score = LinearSVC().fit(X_resampled, y_resampled).score(X, y)\n",
    "        scores.append(score)\n",
    "    return scores\n",
    "# print(learning_curve(X, y.ravel()))\n",
    "# ll = [0.4565572981814683, 0.5635523910324257, 0.5653484717277655, 0.5463292600788993, 0.582026363898778, 0.556849161294461, 0.6444722409313961, 0.6731133134481542, 0.6833766317072388, 0.7048975271817569, 0.7021392603996279, 0.7021392603996279, 0.7046730170948394, 0.7046730170948394, 0.7047050899643991, 0.7030373007472979, 0.7030373007472979, 0.7111838096154462, 0.7111838096154462, 0.7097084576157029, 0.7096763847461433, 0.7125308701369512, 0.6971038198787646, 0.6971038198787646, 0.6712530870136951, 0.6874819590108727, 0.6874819590108727, 0.6874819590108727, 0.6852047852721384, 0.6842425991853491, 0.700086596747811, 0.6971679656178839, 0.6907854645755156, 0.6869046473587992, 0.6861028256198082, 0.6867122101414413, 0.6900798614452035, 0.7011770743128388, 0.7077199397030052, 0.7077199397030052, 0.7201321402225858, 0.7342121299592674, 0.7342121299592674, 0.7565348471727765, 0.7565348471727765, 0.7565348471727765, 0.7565348471727765, 0.7565669200423362, 0.7775425767343405, 0.7775425767343405, 0.7775425767343405, 0.7777991596908176, 0.7777991596908176, 0.7777991596908176, 0.7784406170820103, 0.7786009814298085, 0.7786009814298085, 0.7786330542993681, 0.7786330542993681, 0.7786330542993681, 0.7791141473427627, 0.7801084062991116, 0.7623400365630713, 0.7623400365630713]\n",
    "ll = learning_curve(X, y)\n",
    "print(ll)\n",
    "print(ll.index(max(ll)))\n",
    "# plt.plot(range(1, 65), ll), linewidth=4)\n",
    "# plt.title(\"RandomUnderSampler Learning Curve\", fontsize=16)\n",
    "# plt.gca().set_xlabel(\"# of Points per Class\", fontsize=14)\n",
    "# plt.gca().set_ylabel(\"Training Accuracy\", fontsize=14)\n",
    "# sns.despine()\n",
    "# plt.show()\n",
    "# pass"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n/IWLyExPo03b9jTrsh/X/eWOKt0TdNrkb3jmvjtI25JHYVIj+hz7a4ZeNKwOt0xEpGYS6p6i7s7l\nZ53Cdd0zaNk0DYDF6zYyek0zbnv4cW68YhhnNF/PY5/N5Oqje5KV0QSAFRvyeWxZMnc/+XxM68nO\nzubOS4cy6oguJCUFZ9y+Nz8X+8kpnHnuBdWuX0SkmqJ3T9EpUyZzWNOtO8IcYM+WGWSsW8LcuXNp\nvGox27YVsX+7VjvCHKB986bssXUVixcvjmk9zz38AFf07rAjzAEG7Z3F12PfrL2NERGpZQkV6MsW\nLaZzevJO7R0aJzN37lzaNTayN+SzZ6uMnebp1CSJ5cuXx7Se9atzaV3iTWO7lOJtVS9aRKSeJFSg\nH/HTnzI+Z+tO7TPznGOPPZZZG51eHdswYcGKneb5Zl0RvXr1imk9fY4awMQlq0u1bd1WhGe0rl7h\nIiL1IKECvU2bNnTofwzPTFtKQeE21m/eyv1fL+LI086hcePGDDjjfJ6Yvpz2zZvwr89nkr91Gxu3\nFPLI5CX0Pv50mjRpUvlKgJN/cybvrG/C+IW5uDsLV+dxy5dL+f3Im+t4C0VEqi+hdopuN33aNN54\n/ilSUhsx5He/p1u3bjumLVy4kNGPPcyy5ctITkoiKyuL31wwjP33379K6yguLuadN9/gy4/ep2PX\nbgy96BKaN29e49pFRKohpp2iCRnoIiK7mdq5wUUiKCoq4r333uPFF56jSbLxh5F/onv37jumuzuf\nfvIxi3+Yx8+OHchee+1V6vkbNmzgldEvMP6zz2nVqiW/u+RSDjrooPreDBGRGkmoMfTyLF68mPPO\nPZeiom2MuO56OnTYg5EXnc1V5w8FYPXq1Vz6m8HkvHgPB8wex8sjh3Hnn27Y8fz/vj6GYaccz3dT\nJ3P5VVfz6xNP5pYb/sgVF55LfX56ERGpqYQfcrnmmmsYNWoUaWk/Hmb4wJ23Mfu9V7j8n8/z6hMP\nc0m7Alo0abRj+mvfZbP/BdfTp29frvnNr2jeZT9uufv+HdOLi4u5+MxTOWfYpRw/+KRarVdEpBqi\nd2JRWUVFRaSkpJQKc4CzLryYrLZteejOv7Ft9fJSYQ5w4v7teG/Mi3z6ycdkJhVy8m8vLDU9KSmJ\nQ444kv++MrrOt0FEpLYkdKAnJSVRVFS0U3teXh5WXER68xY4O5+ItGnrNho3bUp6RgbFwIZ1a3ee\n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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "rus = RandomUnderSampler(random_state=0, ratio={0: 30, 1: 20})\n",
    "rus.fit(X, y)\n",
    "X_resampled, y_resampled = rus.sample(X, y)\n",
    "colors = ['#ef8a62' if v == 0 else '#f7f7f7' if v == 1 else '#67a9cf' for v in y_resampled]\n",
    "plt.scatter(X_resampled[:, 0], X_resampled[:, 1], c=colors, linewidth=0.5, edgecolor='black')\n",
    "sns.despine()\n",
    "plt.title(\"RandomUnderSampler Output ($n_{class}=[30, 20])$\")\n",
    "plt.show()\n",
    "pass"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n8vJyCgsLIxuVkk6+OZJyPnqJVo3qTu4uTjR9+nQaMWIEJScnk06no99//53c3d3pyJEjlJ6eTg4O\nDrRjxw4qKyujgoICWrx4MQUFBT3Sjc5HyYhhQ2hKcCAlfTCJClZNpZ9eGUqOGjVdvny5oYfWqJg2\nbRqNGjWKUlNTZlICGgAAH+NJREFUSafT0alTp8jNzY2OHz/e0ENj/HNp+mvoACwHZZRKJQwGAziO\ng1gshtFoRGlpKYRCIRQKBYxGI4xGIyoqKiAWi2EymSAWi1FZWQkejweJRAKdTgeDwQA+nw+pVAq9\nXg+RUAgzEXRlZZag0RU6HdoGBcHN2RG3bicgNT0DCoUCAoEAzz77LH7//Xfk5ubAaDRBLpejrKwM\nBoMBvXv3xpYtW+Dq6ori4mJs2bIF4eHhcHZ2xowZM9CpU93swcvKyrBt2zb89ttvsLOzw/Tp09G9\ne/c6tXE/Wq0WM1+ehr37D0Aul4PP5+PNOXOxZMmSerfZHNHr9ZgzZw527doFmUwGsViMlStXYuLE\niQ09NMY/l1qtodfX2+IT4eDBg5DL5bCzs0NZWRnEYjF69+6NMWPG4NatW1i3bh34fD4++eQTFBYW\nYtWqVbCzs7P8XNZoNMjPz8fUqVPRs2dPnDx5Ejt37oBRr4fYxGFu/7YQ8XlYdTIG3j4+eGv+fADA\n2rWf4E58HAqS4vH6023wtb4ErYI6Q6GywYkTJzBv3jwQEdavX4+MjAw4Ozog/Ow5y7p8YWEhevXq\nhYCAAISEhODOnTsYPnw41q1bh9DQ0FrJXlpair59+8LFxQXjxo1DRkYGxo4di/fff98qQEJdkEgk\nyMorQI+evfDCCy+gsLAQ69evh0AgwMKFC+vVZnNEIpHgiy++wCeffIKioiK4uLhY7ccwGI2W2j7K\nP4qrrksuqD5UNHnyZOrZsye9+OKLVr5QTp8+TQqFgvbu3Us6nY5u375NUqmUgoODLf5d1q9fb1Xn\ns88+o5aOdjSyvScVrp5GG0J6kaODA+Xn51vK5Ofnk6ODA7Vz1dCqkcGUseIFcrVVk5ubm1W5vLw8\natGiBYnFYvrmm28s43733Xdp8uTJVv2eOXOGnJ2dqaKiolayr127lp577jmLPxqdTkdXr14lW1vb\neh8U2rFjB/Xu3ZvKysosbSYkJJBarabs7Ox6tclgMJ4ItdKxjX5TNCQkBL///jvKysowadIkq7yu\n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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from imblearn.ensemble import EasyEnsemble\n",
    "e = EasyEnsemble(random_state=0, n_subsets=51)\n",
    "e.fit(X, y)\n",
    "X_resampled, y_resampled = e.sample(X, y)\n",
    "colors = ['#ef8a62' if v == 0 else '#f7f7f7' if v == 1 else '#67a9cf' for v in y_resampled[0, :]]\n",
    "plt.scatter(X_resampled[0, :, 0], X_resampled[0, :, 1], c=colors, linewidth=1, edgecolor='black')\n",
    "sns.despine()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(57, 8570, 35)\n",
      "(57, 8570)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([  5.,   1.,   1.,   2.,   0.,   9.,   3.,   0.,   0.,  19.,   2.,\n",
       "         3.,  22.,   1.,   0.,   1.,   0.,   1.,   4.,   2.,   0.,   1.,\n",
       "         1.,   1.,   1.,   1., 105., 105., 105.,   0.,   1.,   2.,   2.,\n",
       "         2.,   0.])"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "print(X_resampled.shape)\n",
    "print(y_resampled.shape)\n",
    "X_resampled[0][0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\model_selection\\_split.py:2053: FutureWarning: You should specify a value for 'cv' instead of relying on the default value. The default value will change from 3 to 5 in version 0.22.\n",
      "  warnings.warn(CV_WARNING, FutureWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\model_selection\\_split.py:2053: FutureWarning: You should specify a value for 'cv' instead of relying on the default value. The default value will change from 3 to 5 in version 0.22.\n",
      "  warnings.warn(CV_WARNING, FutureWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\model_selection\\_split.py:2053: FutureWarning: You should specify a value for 'cv' instead of relying on the default value. The default value will change from 3 to 5 in version 0.22.\n",
      "  warnings.warn(CV_WARNING, FutureWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\model_selection\\_split.py:2053: FutureWarning: You should specify a value for 'cv' instead of relying on the default value. The default value will change from 3 to 5 in version 0.22.\n",
      "  warnings.warn(CV_WARNING, FutureWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\model_selection\\_split.py:2053: FutureWarning: You should specify a value for 'cv' instead of relying on the default value. The default value will change from 3 to 5 in version 0.22.\n",
      "  warnings.warn(CV_WARNING, FutureWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\model_selection\\_split.py:2053: FutureWarning: You should specify a value for 'cv' instead of relying on the default value. The default value will change from 3 to 5 in version 0.22.\n",
      "  warnings.warn(CV_WARNING, FutureWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\model_selection\\_split.py:2053: FutureWarning: You should specify a value for 'cv' instead of relying on the default value. The default value will change from 3 to 5 in version 0.22.\n",
      "  warnings.warn(CV_WARNING, FutureWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "C:\\Users\\ljt\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAD8CAYAAABn919SAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvFvnyVgAAIABJREFUeJzs3Xd4FFX3wPHv9t3sbjaV9J4QCB0C\noVcpIh2kiEpRRAFffe0FFNtPX0XFhr0hiqBSpXdpUkLvoQQIkABJSEjP7p7fH9HFNaiAgUCYz/Pk\nAe/euXNmiCeTmTP3qkQEhUKhUNz41JUdgEKhUCgqhpLQFQqFoopQErpCoVBUEUpCVygUiipCSegK\nhUJRRSgJXaFQKKoIJaErFApFFaEkdIVCoagilISuUCgUVYT2Wu7Mz89PIiMjr+UuFQqF4oaXnJx8\nVkT8/6nfNU3okZGRbN68+VruUqFQKG54KpXq6KX0U265KBQKRRWhJHSFQqGoIpSErlAoFFWEktAV\nCoWiirgpE3pJSQkHDx4kNze3wsbMz88nJSWFwsLCChtToVAoLsdNl9A/eP89woIC6diyGeEhwYwa\nOYLi4uIrHs/hcPD0E48TGhRI59bNCQ0K4KUXxqMsHKJQKK61a1q2WNlmzJjB26+8yOxhbakR4E1m\nfhEPzlzJY/99iPcmfXRFY772f//HqlnTWPuf2wi2mTmWdZ4hX32Kt68vY8Y8WMFHoFAoFH9NdS2v\nJBMTE6Uy69DbNE/ivjgrt9WOcLWdPl9Ik7fncCI9A7PZfFnjiQjB1fyZNaQN8QFervZNR08zZv5O\n9h9OrajQFQrFTUylUiWLSOI/9bupbrmkpZ1wS7wA1awmjDot2dnZlz2ew+HgdFY2cf42t/bq1bw4\nkZ7xr2JVKBSKy3VTJfSkpk1ZsOe4W9uW42fQG4wEBQVd9nharZb6tWqyaJ/7mAv3HqNJo4b/KlaF\nQqG4XDfVPfSx41+kbcsW2EXoGB/C7lNZvLx0J69MeBuNRnNFY77y+gSG3DGQjNxCGkf4s/ZIBhNW\n7mbG3HkVHL1CoVD8vZvqCj0hIYFVa9eR6hXLfXO3M+uMhs+mTOXuIUOueMwuXbowY+48VhV7MmLu\ndjarqjF/yTJatmxZgZErFArFP7tpHopu2bKF/73yErt27iAiIhKLlzd7d27Hy8uLex8Yw913341K\npeLIkSO89srLrF29isDAQEY//Ci9e/eulJgVCoUClIeibtavX0/n9u1o6Ejn42516WwrZsm8n7mj\nui+janrx9vNP89QTj3Hs2DFaJDXGenQrk26tzZ3heh4fPZKJb71V2YegUCgU/+imuEK/pU0r+gWp\nGNgoztW2aO9xXlmUzC8P9yIzv4jEN2fTt18/LMe2M77LhQeah8/m0unjxRw7eQoPD49rHrtCoVAo\nV+h/sCl5C11qhru1dYwPZW96NiV2B75mIw0iAln9yy/cWiPErV+0nycBNjMHDhy4liErFArFZbsp\nEnpwYAD7Tp9zazt0NhcvkwGdRo3D6eTg6WzCwsLYn+HeL7+klFPZuQQGBl7LkBUKheKy3RQJ/T+P\nPMZT87ZwLOs8AOm5BfznxzWMaF6TwlIHzy3YQnT1eMaOf4HXV+1hW9pZAHIKS3hszmY6d+6sJHSF\nQnHduynq0O9/4AGyMs/S7s0J2EwGzubmY9TrOLblCJPW7adt2zb8+NVk/Pz8ePXNiQx+/FG0CDkF\nhXTv1o0PP/28sg9BoVAo/tFN8VD0d4WFhaSlpREUFISHhwdHjhzB09MTf3/3tVftdjupqan4+vri\n7e1dSdGWERFWr17NkiVL8PHxYdCgQX/524KIsGnTJubNm4fFYmHAgAGEh4dftG9FxPXrr7+yYMEC\nbDYbAwYMIDQ09Krs62rauXMnM2fORKPR0L9/f+Li4v55I4XiGlMeil6EyWQiLi4Oi8WCWq0mJiam\nXDKHslf6Y2NjKz2ZOxwOBg/ozz2Dbqdo/c9s+eFzasVXZ+HCheX6ighjHrif27vfSu6a2eybPZkG\ndWrx/fdTKzwuEWHE8KHc0bs7+evmsmvGl9SrlcCMGTMqfF9X0wvPP0fHNq04s+In0hZPo3njRnzw\n/nuVHZZCccVuqiv0G83UqVOZMPZx5t3TAaOu7O7Y+iPpDJv+K8dOnkKv17v6Ll68mDHD7mLZ/Z2x\nGnUA7DqVRffPlpJ6PA2bzXbRfVyJuXPn8tTo+1g8siNmfdm+tqWdpe/XKzh24tRlz1pZGbZv306X\n9m34ZUxX/C0mAI5lnaftB/PZvnsvYWFhlRyhQnGBcoVeBcyYNpV7E6NdyRygWVQgYV5m1q5d6973\nh+kMaRjpSuYAtYN8aBwVyJIlSyo0rp+mTWVYoyhXMgeoH+pHnRB/VqxYUaH7ulpmzJhB/3qRrmQO\nEO5j5dZaEcyZM6cSI1MorpyS0K9jarUau7P8b1AOkXKTif1lX2f5vv+WRqPFcZF92Z1O1Oob41tK\nrVZf9BgcQoWfL4XiWrkx/u+7SQ24824+2XiIvOJSV9uy/Wmczi+hefPm7n3vGMzXyUfIyi9ytW0+\ndpptx8/QsWPHCo2r/x2D+WzzIXIKLyzdt+5IOgcyztG+ffsK3dfVcvvttzN9eypp5/JcbQdOn2Px\nnmP07NmzEiNTKK7cTVG2eKPq3bs3SxbOJ2niT3RLCCM9v4R1h9P5afYctFr3f7o2bdowcMgwmr37\nCd1rhZFT7GD5/jQmfzcVi8VSoXF16tSJHrcPImni13SvHU5mQQmrDp5k6vQfMRqNFbqvqyUhIYGn\nxz5H2xdfoFvtCEocThbuOcbb7753RXPjKxTXg5vuoajdbmfXrl1YrVZiYmL+tm92djaHDh0iKioK\nX1/faxRhedu3b2fp0qV4e3vTt2/fv33AuW/fPubPn4/FYqFPnz74+fm5fe50Otm9ezdarZYaNWqg\nUqmuOK7du3ezaNEirFYrffv2xcfH54rHqiypqanMnj0brVZL7969CQ4OruyQFH8iIqSkpFBYWEjt\n2rVvyltil/pQFBH52y8gDFgB7AV2Aw/91j4eOAFs++2r6z+N1ahRI6lMs2bNkpAAf4kPDZQAb5s0\nb5woqamp5fo5HA559NFHxWazSf369cVms8moUaOkpKSkEqKuOL/88ovERoRJTJC/hPn7SN2EGrJj\nx47KDkuh+Ev79++XxMRECQkJkbi4OImIiJBFixZVdljXHLBZ/iG/isg/X6GrVKogIEhEtqhUKiuQ\nDPQC+gN5IjLhUn/KVOYV+p49e2jbohnf3NGKpMgA7A4nH6zZw0+Hc9i+e6/bleobb7zBzJkzmTZt\nGv7+/mRnZ3PXXXfRrFkzXnrppUqJ/9/KyMigdo143u/dhE41yl4A+j75EK+s2kfKkVRMJtM/jKBQ\nXFt2u534+Hj+85//MGLECNRqNStXruSuu+5i8+bNRERE/PMgVUSFlS2KyCkR2fLb389TdqUe8vdb\nXX8+++RjhjSOJSkyAACtRs1/WtfCnpdTrgTwo48+4s0333S9dOTt7c3EiRP56KOP+KcfgNerKVOm\n0KVmKJ1rhqFSqVCpVAxKjCXe36qU6SmuS4sXL6ZatWqMHDnSVT3Vtm1b+vfvz5dfflnJ0V2fLqvK\nRaVSRQINgA2/NY1RqVQ7VCrVFyqV6qKvVapUqvtUKtVmlUq1+cyZM/8q2H8j4+QJorzdX3hRqVRE\n+XqSnp7u1p6enk50dLRbW2RkJFlZWTgcjqse69WQkX6KCE9DufYoLw8yMjIqISKF4u9lZGQQFRVV\nrj06Olr5nv0Ll5zQVSqVBfgJeFhEcoEPgRigPnAKePNi24nIJyKSKCKJF3vN/lpp2a4Dc/aedLvC\nzsovYt3BEzRr1sy9b8uWzJw5061t1qxZJCUllasuuVG0at2G+QcycDidrrbCUjuL9qUp658qrkst\nWrRg6dKlnD9/3tXmdDqZNWsWrVq1qsTIrl+XVOWiUql0wM/AIhEptx7bb1fuP4tI7b8bpzLvoRcU\nFNAiqTExBgd3NowkM7+Yt1fvo9uAO3ntjTfc+m7evJlbb72VMWPG0LJlSzZs2MDEiRP54YcfaNOm\nTaXE/285HA46d2iHOvMEI5rEUGJ38t66A8Q1bs43331f2eEpFBc1atQoNm7cyKOPPorVauWTTz4h\nMzOTFStWuE19UdVd6j30S3koqgK+BrJE5OE/tAeJyKnf/v5fIElEBv7dWJVdtpibm8t7777Lgjmz\n8LTZGDpiJLfffvtFS/f27t3LW2+9xa5du6hRowYPP/ww9erVq4SoK05RUREfffQRs6Z/j1arZdCQ\nYQwdOvSmLANT3BicTifffvstU6ZMoaioiNtuu43Ro0ffEPMFVaSKLFtsCQiwgz+UKALfADt/a59D\nWSXMNS1bdDqdMmnSB1K/Vk0JDawmdw4cICkpKW59iouL5eWXXpIaMVESERIko+8fKRkZGX877uLF\ni6V9qxYSEuAvHdu2luXLl19SLJ9//rkk1qstoYHVZEDf3rJnzx63PsuWLZNb2rSSkAB/6dC6pSxd\nulRERKZNmybNEhtISIC/9OrWVZKTk0VEJCUlRe4cOEBCA6tJ/Vo15cMPJ4nT6bycU6RQKKoAKqps\nsSJV9BX6U48/xpIZ3zP+lrqEepv5aXsqn28+wqat21xzc/fr1YPzh3bzRNtaWAw6vtyYwooTeWzZ\nsfOiP+Xnzp3LfUPv4uUuDWgcUY31R9J5fvF2vv5uGp07d/7LWF5+8QWmff4RL3aqR7SfJ3N2HuX9\n9Sms3bCR2NhYFixYwLDBg3ipS32SIgPYkJrBuIXb6DtwEItm/cTLneuREOjNon1pvL5yN99Mncaw\nu+7knsQo+taLJC07n/FLd9Cxz0Bee+OSK0UVCkUVUGG3XCpSRSb0zMxMYiMj2PRID/z+MGPes/OS\nMSd24PUJb7J9+3a63dKO5Ed6oNdeuK1wx7e/0POBxxg5cmS5cRvUTuCZpFA61rgwferPu1L5YHc2\n6zdvuWgseXl5hIcE8cuYroR6XXjN/tWl28iNaMiHn3xKkwb1eLheNbrWurDgxM+7Url/2hqWjL6N\nmoEXioQ+WrObbw9k0ybQxMtdG7naz+YVkvjWbA6lHqvUN1cVCsW1VeWnz92zZw/xwX5uyRygfWwA\nWzb+CsCWLVtoGRvslswB2kX5sXXTxnJjOp1Otu/ZR/vq7mX27auHsnXnrr+MJSUlhRBvT7dkDtAu\nNoitm8v2s2XnLjrEu4+bEOiDTo1bMi/bXwgn09JoH+u+MpGfxUR8sD979+79y1gUCsXN64ZN6OHh\n4RzKyKKw1O7WvvNUNpExsUBZ7fiuU1nlXgbadTqPyNjYcmOq1WrCgwLYdTLLfcyTmUSE/PW7VKGh\noaRl5pBbVPKn7bKIjCqbLyYyNISdJzPdPk/PzafI7iA9t6Dcdl5eNnaeynZrLyy1czgj66otK6dQ\nKG5sN2xCj4iIoG27djw8ayOZ+UWICEv2HefD9Qd48OFHgLIZCHWePrywaCt5xaXYHU6mbk5h4b4T\nDBs2/KLjPvLEkzw0exMpp3MA2JuezSNzN/PIE0/+ZSz+/v706tWLMTM2kHG+ABHhl4MnefOXPTz0\n2OMAPPrEU/x3zmb2Z5wDyqZqfWr+Nlq3asWoGb+6pnHdePQ04xdv55GnnmXSuv0s2XccEeFsXiEP\nz9pI23btlISuUCgu7lKenFbUV0VXueTl5cm9Q4eI1cMkNrOHJMTFyMKFC936pKenS+9ut4nZZBSr\nh0maNmrgqiK5GKfTKf979f+kmo+3+HpaJNDPR96aMOEfq0sKCwtl9P33iafZQ7ytZqkeHSkzZ850\nG3fC669LgK+P+HpapJqPt7zx+v+kpKREnnjsEfGyWsTHapGIkCD5ZvJkERFZuHChJMTFiM3sIVYP\nk9w7dIjk5eX9izOmUChuRNwMVS6/KywsJD8/H19f33I15adOneKrr74k9fBhEpskMWTIkEt6IaG0\ntJTs7Gx8fHzQarXk5+fz3XffsX1LMjHV4xkyZMhFp4stKiri/Pnz+Pn5kZOTw+TJkzmwdw+169Xn\nzjvvxGg0kpWV5Rr3d8XFxeTm5uLr6+u26o+IkJmZidlsxmQysXXrVr7/7jvsdju9+/alRYsW/2oK\nXIVCcf2r8lUul2LNmjX07t6N7rXCiPX2YMHB0xSbbCxbtRqr1XrJ46Snp9O6eTNirFraRPqyNT2X\n1UfOsHTlKhISEi66TUpKCu1ataRpmA+JwTbWHstiT1Yhq9aud5VUXq7XX3uVt9/4H3c1ikGvVvHt\ntlR63j6Qie+9f0XjKRSKG8NNn9BFhITqsYxrEUXXWhGutnunr6Ve90E89/z4Sx7rvnuGoz+czMtd\nL5zPT9ftZXG2liUrf7noNt06d6SpPpcxrS/MhvDS4q2c8Y9n8ndTL/t4UlNTaVS3Dmv+040gmwcA\nOYUltP5gPtPnzCcpKemyx1QoFDeGKl+2+E8OHTpEbnY2tyZceICoUqm4p0ksc3768bLGmjtnNiOa\nxru13d2kOmvWb6CgoKBcf7vdzuLlKxn2p21GNI1n7s8/X9a+fzd//nxurRXhSuYANpOe/nUjmD1r\n1hWNqVAoqpYqm9ANBgMldnu5ld0LSuyXve6lwWAgv8S9PLKo1IFarbroPCgqlQqtRkNRqftUuwUl\ndoyGK5tQyGAwUGgvP3VvQakDo7I4hUKhoAon9LCwMOLj4/l0/T5XW2GpnbdX7+OOoRcvWfwrd9x5\nF6+v2IXdUTb1rIgwYcVOenS7DYOh/BzjGo2G/v368tqyna4aeIfTyWvLdzJo8J1XdDy9evVixYE0\ntqWddbUdycxl+rYjDBz4t3OiKRSKm0SVvYcOZbddunRoj69eRayfheX7T3BL5y58+c2Uy5phsKCg\ngD49upGyeyctogPZdiILnc2HBUuWUa1atYtuk5WVxa0dO5B3Jp3EcD/WHs4gIi6e2fMWYLFYLrrN\nP5k5cyb3DL2bFjHB6DRqVuw7zv8mvMl9F5nCQKFQVB03/UPRvXv3MmHCBNRqNY0bNwagWbNm1KlT\np1zfvLw8Vq5cyalTp2jevDm1atUq10dE2LhxI9u3byc6OhovLy/y8vJo0qQJHh4e5fr/vs2qVas4\ncOAAtWvXplmzZv+6xPDcuXPMmzeP0tJSunbt+pc/UK6mlJQUjh8/Tt26dfHz87vm+1cobjYVNn1u\nRX5V9ItFF1NYWCgN69QWs14r9UJ8xUOnFbNeK4kNG0hxcXG5/h9/9JFYTUapGegtgZ4e4mkySOOG\n9SU9Pf2i4x84cEDq1IyXmCB/aRwXLj42q3z15ZdX+aiuD9nZ2XLrLR0kwNsmLWtGiZfFLE8/8bgy\npa9CcZVxiS8W3Zjrqf2Ne4YOwafkHCnP34FJpyW3qITBXy1l844dPDh6FB9/+pmr77p163juqcdZ\nPuY2Yv1tOJ3CB6t38dGaPdw1cACLV6x0G9vpdNKjaxeG1w7k3mbNUalU7E3PpvejD1O7Th0aNWpE\nVXb/vcMJLEhn5xO90WnUnM0rpN/XU4iNr8Hw4Zf3XEKhUFS8KvVQ1Ol0MmPGDN7u2xyTruxnladR\nzyvdkzAbdHw7ZYpb/88++pAHW9Yk1t8GgFqtYkzr2hh1GjZu2sSxY8fc+q9duxZNSSH3Not33Tqp\nGejNiKQ4vvj0k2twhJXn3LlzzF+wkPFdGqDTlH3b+FlMPNuhNp9NUl5sUiiuB1UqodvtdkrsDgKs\n7ve0g20eFJXacdjdSw+zzp4h2ObeV6VSEezpgdVkICvLfdbFrKwsgr0s5e6Dh3iayDxzugKP5PqT\nm5uLh0GP1aBzaw+2mcn803lSKBSVo0oldL1eT0xEGDO3H3Frn77lEB56LVHR0W7t7TrfytStR9ym\n1z2WdZ4dJzMpcUq51/qbN2/OpsMnOZmT72oTEX7YdYIOXbpehSO6foSGhmK12Vh96JRb+w/bU2l/\nS8dKikqhUPxRlatyWbVqFV073cJ9LRJoGhnAqoMnmbxhPwKsWL2WJk2auPrm5+fTIqkx/vbzDEmq\nTnpuAW8t30GhQ3j/408YfJGa8f+9+n98/M7bjGleHX+Lke+2HeWcwcbyX9ZgquIv+MybN4/hdw1m\nZNPqJATYWJySztLDZ1i7YRNhYWH/PIBCobgiN3XZ4vbt27ljQH8y0o5R6nASGhnNjzNmULNmzXJ9\n8/LyeHfiRKZ+8zV5eXnEJ9TihZdf+du5URYvXsxXn31CTnY2nbv35N577/3L0sWqZtu2bUx69x2O\nHz1C4+YtGT3mQQICAio7LIWiSrup53LZt28fBp2WEtQk1KpFn379uHvQACweJkL8fbF6mPC2eGAx\nGqhVPRa7w86WXXs4cuIUC5csdSXzgwcP0rpZU0x6HWaDDqvJgNlo4MVxz9KqXQfUGg3jnnmaugk1\neOP113E4yr+afzHTpk2jYZ1aeFrMNEtsyPz5812fFRUV8ezTTxEWGIC3p5WB/fowfvx4atSogc1m\no3PnzmzcWH75vGulfv36fPLFlyxYtpIXX3pZSeYKxXWkyl2hT/76a55/8lHe7J5IozA/1hxKZ8wP\na7irSRw/bD3MPc1qcHeTeDLzi3hxwWZKnU5Eoye8YXO+/OZCFczp06epFR/H/U1juatxWf/n523C\npNfQt34MD/6whgENY3iqYwOOZefx7MJtNOncnbff/fuKj4vF9/i8ZD6b/C1du3alb8/uFB/dx9hb\n6uDtYWDk9LWc0ViZNGkScXFxzJ07l7Fjx7J8+fKLviSlUCiqnpvylouIEBcVwfu31aVp5IUrx3m7\njvLc/E00jwrgvdtbudqL7Q7qvTqdacM70vfL5STv2EVERNlUuy+9+CJ75nzDhwNau/oXldqp++p0\n5j9wGztPZvLF+n3Mvb/sYWhWfhGN3pzNwdSj+Pr6XlZ8P+9KZdKec3z61WQ6tmnJtkd7otdqyCsu\npc7/fmLzth2E/GFN07feeosDBw7w1VdfVch5UygU17eb8pZLSUkJR9NOkhTh/jp8y5hATp7Lp0V0\nkFu7QauhSUQ1jmSep15EIHv27HF9tnNrMu2ruy8MbdRpSQyvxr6MbFrGBLEn/cIizj5mI7GBvhw4\ncOCy42sVE8SuvfvYtWsXTSID0WvL5pk5lp1HQLVqbskcoHXr1uzcufMSzohCobiZVKmErtfrCfL3\nY8eJTLf25ONn8beaSD5+xq3d7nCyNe0s4d4WdqWdIS4uzvVZ9Zq1WH8ko1z/7ScyifazkXzsDDF+\nnq7PcotKOJSRSVRU1GXHt/nYGWKjIomLi2Pb8TM4nGWzOobYzGScPsOZM+5xb968mdjY2H8+IQqF\n4qZSpRK6SqXiiWeeYdTMDWxPO4uIsP5IOqOm/UKfulHM3nGEL3/dR7HdQcb5Av7z4xqifD35YN1+\nWrZq5ZYkRz7wADN3H+frDfspsTtIzy1g9PTV1A7yJju/iAd/XENSZDXsDifHss4z8of19O7dh8DA\nwMuO77Gfk3ly7HM0bNiQ2JoJPDRzA6fPF2LQqmkQ6kf/22/n0KFDOBwO5s6dy6uvvsqjjz56LU6p\nQqG4kVzKhC8V9XUtJudyOp3y/nvvSnhQoGg1GomNDJfhw4ZJZGiwaNRq8bF4iEatFr1WIyadViwe\nJnlw1AOSn59fbqzk5GSpVT1W1CqV6DRqMRt0olappHp0pIwbN06SGtYXrUYj3p5WeeKxRy86+dfF\n4nvv3Xfc4pv89deuz3NycmTEsKFiNhlFq9FI+9YtZeTIkeLn5ydarVYaNWokixYtqtBzplAorm9c\n4uRc//hQVKVShQGTgUDACXwiIu+oVCofYBoQCaQC/UUk+6/GgYp/KLp06VJeffklTqUdxycgkIK8\nPIryzlO3cRJvv/02Pj4+6PV6VCoVGzdu5ONJk9i5cwcmo4FWbdsx/J57iYyMRK0u+0WlpKSEadOm\n8dnHH3Ho4EFUCA4RSktL8bRa6XRrV0be/wCrV69m07o1qHR6HKWlaLUauvXsTe/evS95nnURoaSk\nxBXfnzmdThwOBzqdztW/tLQUvf7KVjy6FLt37+aLL74gMzOTtm3bMmjQoIsu4HE1iAgrVqxg2nff\n4nDY6dt/IF26dPnX0w1fT1atWsXUKd9QWlJC79v707VrV9f3nkLxdyryoagdeFREagJNgdEqlSoB\neApYJiJxwLLf/vuaGfvM09zRpwetPAoYWjuAk/t3UXI6jQcahnBm6xpqxsaQlpaGSqXi/ffepXvn\njsz5cRrBpdkMCNVxYvlMkhIbkpycDEBxcTEd27Xhqf+MYuvmTdTxNfBU63i6x/lTUlhAztkzJC+c\nSYukxnz/3hsU7N3M/Bk/EpmdQp38I/zfEw/Tr1fPS65FV6lUGAyGv0xYarXalcx/7381k/m0adNo\n164dBoOBpKQkvv76a9q3b3/RNVOvhqeeeJwRgwcQnrGLuKz9PHLfMEbeew//dMFxo3hu7LMMHdCX\nkFM7ic9J4anRIxg+5K4qc3yK68Nlly2qVKrZwPu/fbUVkVMqlSoIWCki8X+3bUVdoaemplK/Vk02\nPdYbf0vZ6/aFpXbavjOb13s2o01cMPd/v4oTxmrMmjOXmMgIbompRpiPledvvfBD7vvkg0w+lMe6\nTcl8/PHHfPzqCxw9k0W/+tH8r1czV79ZO44wYek2TuTkM7ZLI75Yv48TOfms+W8vQr3KVh8qsTvo\n/MkSnn/7A3r16vWvj/FaKioqIjw8nDlz5lC/fn2g7Iq5X79+dOrUiYceeuiq7n/v3r20ad6UDQ93\nx9uj7DeCvOJSWr0/n6mzfqZp06ZXdf9X26FDh2jaqAHrH+qG32/frwUldlp/sIDPp/5AmzZtKjlC\nxfXuqpQtqlSqSKABsAEIEJFTAL/9ec2Wzlm8eDHt44JdyRzApNPSv2EsS/enAXBPs5rs27mDlStX\n0jQmmPWpGdzdpLrbOP3qR7N9125ycnJYMGcmIVY9WrWKoU1ruPXrUTuStJx82sQGoVWpOZKZS8vo\nQFcyB9BrNQyqF878ObOv4pFfHcnJyYSFhbmSOZT9RjB06FAWLFhw1fe/aNEietSOcCVzAItBR59a\nocybN++q7/9qW7RoEV0Swl0Tb7EhAAAgAElEQVTJHMBDr6V/nTDmz/u5EiNTVDWXnNBVKpUF+Al4\nWERyL2O7+1Qq1WaVSrX5z+V3V8pisZBZUFyuPTu/CLO+bB70rIJitFoNFouF7IJizHod2X/aJq+4\n1HUrw2L1xCmCRq0mu9C9X36JHYfDSW5RKVqNChEpNxZAVmEJFk/Pcu3XO4vFQnZ2drlf/7Oysq54\n/dPL3n9Rabn2c8UOrFbrVd//1WaxWDh3kePLKirFYr3xvl8U169LSugqlUpHWTL/VkRm/Nac8dut\nFn7786ITgovIJyKSKCKJ/v7+FREz3bt3Z8epc/xy8KSrbX/GOb7fcpDbG8SQW1TCiws206l7L9q3\nb8/J80U0CPPl/xZtoai0bE50p1N4eck2enbvhslkYui997Ez4zw5RcW8vCCZghL77/Hz+tKt1A/1\nY8fJTJKPn6VtXAiHz+aycM+FBTBSM3P5atMh7hoytEKO8VqqW7cunp6efPrpp662M2fO8NZbbzFk\nyJCrvv8+ffqwMuUEG1Iv1P3vPJnJrJ2pDBo06Krv/2rr2bMn64+ks/YPUw/vTc/mx+2pDB48uBIj\nU1Q5/1QGA6goq3KZ+Kf2N4Cnfvv7U8Dr/zRWRZYtLl++XDzNJqkb4ivNogLEoNWIn9kot8SHilmv\nlfq1E6S0tFRERDZt2iQhAf4S7G0VL5Ne2lcPkTBfm7RqliSZmZmuMV956UUxGfRi0WvF06iTdnHB\nEmIzi4+HQcx6jfhajBLi7yc+VrO0jI8Qs14ndUJ8pVOdWPGymuXDSR9U2PFda/v375e4uDhp0KCB\n9OjRQ7y8vGTcuHHXbL3QBQsWiJ+3TdokREv72jHi7WmVadOmXZN9XwtLly4Vf28vaVUzSjrUjhEv\nq0WmTPmmssNS3CCowLLFlsBqYCdlZYsAz1B2H306EA4cA24Xkb9duqaiyxaLior4+OOPWb58OQ0b\nNmT58uUcO3aMqKgoQkJCqFmzJgkJCbRv3x6TycSiRYv4+eefSU9Px2g00qJFC4KDg4mNjaVevXoA\npKens3jxYn799VfS0tLQaDSuUsRu3bpx9913k5qaysaNGzl9+jRnzpwhOjqanj17otVqWbVqFUaj\nkbZt27pVqfyRw+FgzZo1ZGdns2XLFtatW0ft2rUZOnSo233sizl79ixr1qzB29ubVq1aucrejh8/\nzubNmwkNDSUxMfGKyv0cDgerVq0iMzPTdW6upYKCApYtW4bD4aBDhw5V4nbLHxUWFrJs2TJKS0vp\n0KEDnjfg7TlF5bjUh6I37ItFTqdTxj37tHhZzNI4KkisBp34eBikeoC3GI1GadasmcTGlF0JeZo9\n5Kknn5RqPt7i7WEQm1En4d4WsRh00jo2SML8vKVDm1aSnZ0tIiLz588Xf28vaVkjShIjA8Wo00hi\nVIhEBvhK6+ZNZf369VI9OkrqRARLp3px4mUxy8D+t4u3p0Xa1Y6RJnHhEhJQTdatW1cu7t27d0ts\nZITEBfuLp0EnfmajtIoJFE+jTrxMemndopkrjj97/X+viZfFLJ3qxUndyBCJi4qU3bt3y4OjHhAf\nq0W61o+X2CB/SWrUQNLT0yvsXCsUispFRV2hV6SKvEKfMWMGzz40itnD2tHy7Vm0iQ3mribVGTN3\nK0tX/kJ4eDgAX3/9Fa89N5Yz53II97YQ6etZNm3t4XS+HXILHnotDqeTx+ZswhlZlwkT36FGbAzf\n3dmapN9mRNx09DQDvlzCuv/25q1Vu5i16xhPt6/D0KTqqFQq1hw6xaCvlrJkTDdqBHgDsGjvcR6a\nk8yR42mulYycTic142IZ0yiElxZspnPNMCb2bYFGraagxM4dXy3hfLGdWi07MPm7qW7Hu3z5coYP\n6s+8e28hxMsMwFcb9vO/1QcIsej5aUg7bCY9Tqfw4uKtHNT58/PCxRVyrhUKReWq8rMtfvnJh/y3\nZQ2OZJ4np7CEl7o14Yedx3nw4UdcyRzg7ruH4GHzomutcI5knue1HklM23KIcV0a4fFbRYxGrea5\nTvWZMWsW3377LbfUCHUlc4DGEdXoUjOMObtS6V4rFJ04XMkcYGXKSYYmxbuSOUDnmmEkBHq7LV6x\nYcMGNKWFtI8LKov5tiZofrtl4qHX8mznRuQVlTBj1iwKCwvdj/fTjxndvLormQMMaVKd0oI8nmpX\nC5up7KUjtVrFkx3qsmbN2nKTeikUiqrthk3ouTm5+FmM5BSVYHcK3h4Gzpc48PtTJY1KpcLPzxcP\nnZYShwNfi5G84lJ8zUa3flaDDqfTyblz5/Azlb/37Ws2kltUgt1Rtq8/3qM+X1xKNWv59UT9zHpy\ncy9UeObm5uJnMZFdUFK2T6P7fvwsRvJKSkGE4mL3ssjzOTn4eri/hq9SqVABvh7ux2LUavAw6snL\nyysXk0KhqLpu2ITeuVsPvt16hKaRAVgNOqZuTqF9pC+Tv/gMp9Pp6nfw4EF27NzN6kPpBHl68M3G\nA7SrHsKUTe7zls/ccYS6tRLo0aMHs3cfJ7eoxPVZXnEps3YcoUP1UM7mFXL4bC77M865Pm8XF8zk\njQcosV947f9MXiHL9h2nQ4cOrrZmzZqxM+0MRp0Wk07LrB2pbjFM2XSAOH8btWrWwMvLy+2zTt16\nMHXHMZzOC7fIDpw+R5HDyZQth9z6Lj9wAounzbVYh0KhuDncsPfQc3NzadOiOYHqIjSOUpYfOMGA\nhjFsPJGDZ3A4w+8dwamTJ3nv3XewalWYbN5knT1DTl4+tyaEs/rQKdrEBtOpZhhbTmTx085jzF2w\niKSkJEbfP5Ll82YzPDEKFSomrd5NpI+F2qHVmLr1MCPuf4AvPvmIEUlxBFtNTNt5nJQzuQRaTdzd\nMJL8EjufbjzI8AfGMO758W5xf/rJJzz39JNE24xsSTvD3U3iSQz3Z+m+NJbsP45TrWPhkqXlXncv\nLCykY7s2aHPP0L9OGOnni/h0QwpPjn2OSe+9S20fA53jAth/9jzfbD7Ed9N/pGPHjhVyrhUKReWq\n8kvQ2e12CgsL+eqrr1i5ZBGpx9NIPXwYZ2kxhXYnVk9PPDw8qFm9OkPvHVH28srKlXz0wftliyw7\nStGbzMTFRNOoSRIjHxhFWFgYarUaEWHBggV8P2UyxUXFeNhs5J/LJjquOvfd/wDR0dFs2bKFzz7+\niKyzZ+h0W3f69+/PvHnzmDvjJ0weHtw5dNhfztGxefNmvvj0E7Zt20ZKSgrO0mJUWh3duvdg/Isv\nERkZedHtiouL+fbbb1k8by6+/tUYPuI+GjVqRG5uLp9//jm/rl5FWGQUIx8Y5bZYh+LG43Q6lZkY\nFS5VtmzxpRdeEC+zSQAxaTVi0KpFBWLRa8Wk04gKxGrQiRpErVKJWa8Vo04jZr1WtFqteHh4iEql\nkqSkJFm2bJnY7XZ5cfzzEujnU9besL5MnDhRIoIDRK1CdBq1mLQa6dyhvRw9elRERI4ePSr9evUQ\nvU4rRr1e6tapLV5eXqJWq6VDhw6SnJz8r4/zz3Jzc2XUyPvEavYQrUYjXTt2kD179ojT6ZS33pwg\n4UGBAki9hBoyZ86cCt+/4upzOp0y6YMPJDI0WACpVT1Wpk+fXtlhKa4DXGLZovYq/2CpUG+9OYGP\n336daUM78PKCZIw6DRP6NCfAamL6lkM8N28jeo2GQYmxfLPxAK90a8KZ/CLeXr6DZrEhFFoDeP+j\nj4mNjeXnn39m4MCBdGzfnmPb1jNrSFti/Dz5dtMBnn78UZ7p1JBhozqRW1jKSws3s3H7Zlo3b8am\nrdto16oFA2oGcGDsQP4zawOlASFM/+FHAgMDmTp1Kl26dGHDhg1/uxzd5erbszu++RlseLgHNpOe\nbzYdoH3rVgy/914WTPuGKQOSqBXow7IDadw39G6mTP/R7f694vr3/nvv8tGE1/isV2MahHZm9aFT\njBk1EoPBQI8ePSo7PMUN4Ia55SIiBPr58N0drfA1G2j9zmwOjBuEUXfhZ9K4nzeSfOwMtYJ9OHku\nn50nM9nxzAD6frqQjSey2bl7j9sScZMmTeLFF8az6eFurpkb75+6ilKnk88Ht3P1czidJL7+E/42\nC7XbduFU8mqm3tmao1nn6fDRYlIOH3HVmgM8++yzqFQqJkyYcEXH+mdbt26ld5eOJD/S3VXmCPDQ\nrA3M3HaYFaO7EuNvc7X/sPUQP5wSFq9YVSH7V1x9TqeTiJAgvhvYjDrBvq72+buP8f7uLNZtSq7E\n6BSVrcrVodvtds5k59AwzI+DZ3Op7m9zS+YASZHVECDl9DmaRQWQmV8EQEKQDz4+PuXW+2zatCla\njdZtGt5Dmbm0igly66dRq0kM9yfYYmDPrp00Di5LngfP5FC3VoJbMv993H379lXUobNv3z4ahldz\nS+YAjUO80SJuyRygSUQ19u3fX2H7V1x9BQUFZGafc0vmUPY9vT8lpZKiUtxobpiErtPpCPDxZsPR\n01T3t7H/dI5rRsTfrTucgQqoEeDNL4dO4f9bbfiOk5lkZWVx4sQJt/5r1qzBbreTnnthVZ7q1Wys\nSHHvZ3c42XD0NGnni6hbvwHr08pKFuOqebF9127y8/PLjVurVq2KOnRq1arFptR0Sh1Ot/b1x7Jw\nqNRuJZQA64+kUyshocL2r7j6zGYz1Xx92Xr8rFv7usPpJNT423VjFAqXGyahA4wd/wLDpqwgNes8\njcP9GfjlEvZnnCOnsJiP1+xmanIKezOyKbE7WHc4nf+2q8tLCzez+dgZmkZUY9DtfdmyZQt5eXlM\nnTqVN954gz59ejPk+zVsSztLXnEp9UJ8WbLvBG8s3UZWfhFHMnO57/tVGLRqctDz2muvcTTfwfiF\nWzBqNbSOCeT2vn3Zu3cv586dY9KkSXz//feMHj26wo67bt261E9szH3T13L4bC5Z+UW8vXInq1LP\n8NjjT3DP9HVsSM0gv6SUOTtTeX7xDp5+bnyF7V9x9alUKp557nnu+3E9aw+doqDEzoI9x3hy/hae\nHf9SZYenuFFcypPTivqqiCqXN998U/xtVlGrEKNWLSadRrRqlVj0WvHQaUWrVonVoBONSiU6jVrM\nep146HViNehEr9OK1WoRvV4vbdu2lTVr1ojD4ZAJb7wukaHBYjTopW2LZvLZZ59JXGSY6DRqMWo1\nYtJppU+P7nLixAkRETlx4oTcNWigeJo9xNvTKo0bNZLg4GAxmUzSrVs32blz578+zj/Lz8+XR//7\nsFTz8RazySj9evWQlJQUcTqd8tGHH0r1qEgxGvTSLLGhLF68uML3r7g2vvzyC0mIixGDXieJ9erI\n3LlzKzskxXWAqjY519mzZ3nllVeYNeMniktKyc/LpbCwGA+zGUdpCQ6HA4vNC6fdjlqrxW6347CX\notFqARUlBfnotBrUOgMWg5aA4BAGDxnG1CnfsGvXTowaNWi0GEwe2EtLEUcpZrOF23r3xVlawsH9\n+ygsKcVsNNC4WQtGjRlDUJD7vfYtW7bw8aQPSD+RRsv2HbjvvpHYbLaLH9Cf7N+/n0nvvcuObVsp\nKinFZjHTsl0H7n/gAfz8/K7onN2sfj+XRw6m0DCpKQ+MGk1AQMA/b6hQVLC0tDQmTZrErl27iI+P\nZ9SoUVdU/ValHoqeOnWKOgk1+OzTT+jT73ZeePFF9EYPunbrxv9efx2zp432HTvh6elJYpMmvP32\n2zzxxBPoDUZKS+0MHTqUdrd0xKFS0yjAwosd63BrgJZxTz7Oju3baBzmxxu9mvLfVjU5fy4bPz28\n0LkBjzSPZd7UyWxeNJu7wnUEFZ1he/JGjiybQaN6dUn5w8OqadOmcest7Qk8tZM+fqVsmP4FSY0a\nkpmZ+Y/Ht2rVKlo2bcKJdYvZvmULrW12Bodq2DtvKon165a796/4aytXrqRl0yYYDmygf4CDY8tm\n0qheXVJTUys7NMVNZs+ePSQmJpKbm8vgwYNxOp0kJSVRkWtC/NkNcYX+n9GjmPXjdP7vzYn069eP\ncePGce7cOd577z3Gjh1Lbm4u0dHRbNiwge+++841cdb+/ftp06YNFouF/fv3M3zYUGJyjvDELWWL\nWWxLO0v3jxdw8LlBGHRa1hw6xcM/rWXNf3u5KmjOF5WSNOEnfrinE7WCfHhmzgYA/KweHLSE8930\nHyktLSUiJIgpA5vTMOzC5GAPzviVqA69efHll//y2ESEhnVq8UjDQF5ckMz/ejWjffUQ1+fj5icj\nNZry/ocfXfZ5u9mICA1qJ/B4Ygi31b4wj82rS7ZxJjCBLyZ/U4nRKW42vXr1okWLFjz44IOutsmT\nJzNt2jSWLVt2WWNVqSv0hQvmc+bceXr37g2UzQ1+xx13ALBixQruuOMOVqxYweDBg91mQYyPjyc+\nPh6Hw8HBgwcZOmw4K49euGKuH+pHgNXE/tM5QNk0uH3rR7uVQ1qNOrrWCmdVStn6pQMbxbIi5QQD\nGkSzdGnZP8qePXvwNOjckjnAgHoRLFnw96vWZ2dnc+hIKvVD/MgtKqVdnPsqQQMaRLFk0cLLOl83\nq6ysLI4cPcqtCeFu7QMbRrNkiTI3vOLaWrZsWbk1YwcOHMiqVauw2+1/sdW/c0MkdB8vL9RqFVlZ\nZSvceXl5kZ6e7vZ3Ly8vTp065bad0+kkIyODgoICPD09SU9Px/aHKWtLHU6yCorx+m0ucS+TnlM5\nBfxZxvlCvH6bujY9twAvk4GM8wV42TxdMWSez3ebbfH3vt4+Pn97bCaTCQEcIhTa7eQVu/9DZ+QW\n4OPjffGNFW5MJhNOgZw/zJQJcCq3AO8/zV6pUFxt3t7e5XJSRkYGFovFtaxlRbshEvqI0Q/iZfHg\n0UceoaSkhCFDhvDyyy9z+vRp7r77bl555RV69uzJm2++ydGjR4GyX78nTpyI0+mkefPmADz/3HN0\nq172cMzpFF5bvAWnU3D+dtupT/1oZu04wq9/WH1+6f401h9Jp1vtCLLyi/i/xVu4vUEM45fs4J6R\nDwAQERFBvXr1eWPFTtf0thnnC5jwy17ufeDvyxdNJhP9+vRhwqo9tIsL4aWFm7H/Vm+eXVDMK8t3\nM3zkqAo8m1WXh4cHfXv34rmFW101+zmFJby8dCf33K+cQ8W1NXz4cJ555hnXeypFRUU8+eSTDBs2\n7IrW/L0kl1IKU1FfV1q26HQ65aExo8XTahWbzSaJjRqJ2cNDjEajNGzQQGw2mxiNRgkPDxej0Sj1\n69eX4KAgsVqtYrVapU6dOmIyGsXmYRSjViMNw/zE32IST5NBjFqNGLQaqR/iK8E2DzFq1eKh00p8\nNS+J9vMUD51WfK1maRJVtrZodDVv8baYZcSwoVJaWuqK8eTJk9KscSOJqOYrbRKixctilheef06c\nTuc/Hl9OTo7c1rmjVPOySpDNIt4eBmkaHSxeFrM8+vBDlzSGokxOTo507XSLBPrYpF2tGPG2mmX0\n/feJw+Go7NAUN5ni4mIZOnSo+Pr6SocOHaRatWrSr18/KSgouOyxqGpliwCpqak89thjrFy5ktzc\nXEpLS12fBQUFYTQaiYiIIDY2lkWLFlFaWkr16tUpKCjgwIEDlJSU4OPjg7+/PxaLBbPZTF5eHjk5\nOfj6+hIZGUl6ejr5+fmoVCpatWrF+PHjWb58OT/88AP79u3DYrG4tr/zzjs5fvw4AD4+Ppw4cQKD\nwYCvry+JiYmXXW64f/9+UlNT0ev1lJSUUK9ePQIDA9m7dy8bNmzAz8+PoqIiCgsLueWWW8qVTaal\npbF8+XI8PT3p0qULRmPZSkYlJSUsXLiQ7Oxs2rVr57ZEX1W1b98+jh49So0aNdizZw8ZGRm0atWK\nmJiYyg5NcZM5evQoe/fuJS4u7oq//6rc9Lnr1q0Ti0EnFrNZrFar9OrVS2rXri1ms4fUDvISg1Yj\ncf6e4m8xilmvlcbh/hJiM4vVYpaQkBDp1q2beHl5ia+vr/Ts2VOiIiPF02IWg1YtHWuESuNwfzFo\nNWIz6iXCxyLda0dIkLdVqkdFikmvE6NWI/HVbGLUaqRJRDXpXDNMjFqNBHtZpG1ciBh1GmkeFypR\nAX7SqX1bycvLu+Jj/Z3dbpehdw6WAG+btE+IFA+TSZo0aSJ9+vQRb29veeONN1x9X3phvHhbzdIn\nsaa0SYiWIH8/2bBhg2zdulVCA6tJyxqR0q9JgvhYLfLs00/eFFf9+/btk+joaGnatKkMHDhQ/P39\n5cEHH7wpjl1RtXCJV+g3REIvKSkRq9lDbCaDVK9eXdLT06WwsFAKCwvlnXfekWo+XrJ49G1i1Gpk\n0+N9pVONUDEbtHJ7YrwMGzpUCgoKZNy4cdK1a1fJzc2VwsJCKSgokAceeEBurRsr2a8Pl+zXh8us\nEV3EatDJiZfvkuzXh8uZV4dK86gAsRh0suqhHmLSaWTGvZ1d/Xc9M0C8TXr5oH8r+eXhnuJl0suu\nZ/pL30bV5ZGHH7qiY/2j999/X5rFhcnh8YOlmpenzJkzx3XcBw8elNDQUPn1119lxYoVElHNV/aP\nG+SK7dshHSQ0KEBiwsPkszvautoPPn+HxAb7y/z58/91fNczp9MpDRo0kHfffdd1ztLT06VevXry\n3XffVXZ4CsVludSEfkM8FF25ciU6nOhMZsaOHev29uW9996LQ6VBq9bQIjqQiSt28Eynhhg0aubu\nOMKLL72ESqVi6tSpjB07Fp2urMpFpVLx/PPPs+rAcQpLyypL2sQF0yDUj+UHyl7k0WrUxPrbGJoU\nz+wdR0kI9KHdH2rEQ7zM3N+yFp+u3UOdYF9uqxXBz7uO8nT7Onw35d/XPH/75ec81iaBjUdPEx8f\n77akXEhICCNGjGDKlCl88+UXjEyKdVuoumutCHwNGuxF+fSpd+HNNF+zkVFN4/jmy8//dXzXs717\n95KZmck999zjarPZbDzyyCNMmTKlEiNTKK6eGyKhFxYWAiCA1Wp1+0ytVuNhMnG+uASbSU9BiR2r\nUY/dKdgdDiwWi2sMT09Pt209PDwA3GYxtBp1FJZeKD8UAS+TgfySUqx/KHn8nc2kp+S37X/f1mrU\nU1BYVCHHbTHoKCq1Y7Fayn1utVopKCigsCAfi6F8bFaDFoNWU+6JutWgo7Agv1z/qqSwsBCz2Vxu\nGTdPT0/X95NCUdXcEAm9TZs2FJY6UJcWM2nSJJzOCwl4zZo1nDuXTYy/Jwv3HmdE85p8vn4vAjSN\nDeXzzz4DoGvXrnzyySdu406ZMoV64QF4Gsvq0I9lnWfVwVNuL/ecLy7hi1/3ckdiLL8eySA1M9f1\nWVGpnU/X7eXWWuFk5Rcxc/sROtcM44sN+7mta9d/fdy39ezNFxsP0iomiHXrN3D48GHXZ8XFxUye\nPJnu3bvTvU8/vtma6vaDaX/GOXadzOJsfjE7Tlx4mcrucDJ5ayrd+9z+r+O7ntWrV4/z58+zZs0a\nV5vT6eTzzz/ntttuq8TIFIqr54apcpn0wQc89t+H0BpMxFWvzuDBgzl48CBff/01zcO8ST5+Fn+z\nkUhfK2sPp9M0KgCtSs0vR8/StWtX6tevz9tvvUWDhg3p3r07Gzf8yqxZs7HpYFSr2mQVFPP5+r04\nnEK32hE0jqjGkn0nWJ96Go0KzHoNfh5GDmXmcl+LBLw9DHy2bi+FpXaGNY3nqw0HqB3kg6fVQvKp\nHFatXU9ERMQ/H9jfOHfuHO1atcBHivDWw/LDmdwzYgR+fn58++231KxZk6lTp+J0OunbswfH9myn\nf50wzhSU8E3yISa8/Q5Gk4kxI0dwR6MYgiwGftx1Ar+oOObMX4her/9X8V3v5s+fz5AhQxg0aBBR\nUVHMmDEDgEWLFrl+O1MobgSXWuVywyR0gI0bN3LXnXdyICUFk8lEaWkpKrsd1OBUabCZTXh6+xAR\nGcWe7dsoLCrCx88PjU7HmdNnKCrMR63W4OXji9NeSnFRMWqNCi9PGw0TE9FodezZuYOikhJio6Pp\n3rs33bp1Z/bs2Xzz9ddknDqBSqNDq1Fj8fAgsVlzzCYDpSWlaA1GSgryqdOgIXfffTc2m42CggJE\nBLPZDIDD4eD8+fN4enricDhcb7D+3UsGRUVFfP/996xf/Qtag5Hf/7W6detGly5dXLcUHA4H8+bN\nY8HPc7F5eXH30GGEhYWh1+s5evQoX33xBVmZZ+nQqTPt2rXDx8fnplhV/siRI3z55ZdkZGTQtm1b\n+vbtW+V/kCmqngorWwS+AE4Du/7QNh44AWz77avrpTyBvdIqF4fDIa1btxYPDw8xGAxiMplEp9OJ\n1WoVtVotRoNerFar6HQ6V7tOpxOTySR6jUY8//CZ2WwWq9ksGhWiBvH09BSdTid6vV4sFrMYtWoJ\nDw6Ud955R6LCQsRqsbi2NRmNEh4WJiaTSTw8PGTw4MFy9uzZcvEeO3ZMetzaWUwGvZgMeunUro08\n+cTjEujnI1YPo/h4WsRiMojFZJT46CiZOXPmFZ2Xv7J+/XpJalhfTAa9mE1GGXrnYMnKypJXXnpR\n/L29xOphkojgIPni888rdL8KheLqoAKrXL4Culyk/W0Rqf/b1/xLGOeK9e3Th9TUVFasWMG5c+dY\nvXo11atXp3nz5nh4eKDV6enWrRuHDh0iOzubDz/8EJvNxrvvvovOaODtiRPJysoiNTWVQYMGERwS\ngr+XDaOHB59//jnnzp1j//79tG/fAaPZQt65LB7778NkZp/j3ffeIysriw0bNqDV6Rg7bhwZGRkc\nOnQIT09Pevb8f/bOOzyqanvY75memUx6h5CQQAATSOi9ShORJh0E8VP0CiIqKKIXy72i4lVRbCCK\nBaQEAlKlSJWmlNBNIKSHhJCeTKbv74/I6Bj8CYiCeN7nmQdm7X3W2XtPnjV71ll7rYGXv+QAsNls\n3NmtC7HOS5z99wjSZo2ks6Ga99+Zy1ejOpH14miS7u9BkEHL/wa04fU7G/HI/7ufPXv23JC1Sk9P\n5567+vJgI2+yXhzN8Vrp/OAAACAASURBVKeH4Ew7SvvWrVj92QI2PngnWS+O4pMhrXh55tOsWrXq\nhtxXRkbm5nNVLhdJkiKB9UKIuJ/evwhUCiGuqaz99bpcvL29SUpKomPHji7ZoUOHGDduHJ6enmRk\nZJCbm+sKSQR44YUX2L17N82bN+ett95yyZ1OJ7Gxsfj7+VE3PJxly5a52kwmExH16mGzVKPXahk1\n7n7e/Ona1157jdzcXObNm+fqL4QgPj6eL774gnbt2gGQlJTEWzOfYv3/6+E2h1GLtnJ3XARjW8cA\nsPtcHs+t+549Twzii4Op7DAbWb3+j38vznh6OlWHtvGfu1q4ZBabnfovfsXuqQNp8IuC0pvPZPP2\nsYscOJz8h+8rIyPz5/FXpM+dLEnScUmSPpUk6TfTAUqSNFGSpEOSJB0qLCy8rhtVVVXRokULN1nz\n5s3JyMigVatWBAUFuRnzy+2FhYW0bNnSTa5QKIiPjyciMhIPDw+3Nr1eT1R0NDq1CqdSRes2bVxt\n6enptcYgSRIJCQlu0Sfnz58nPsQ9PBKgRXggGUUVrvfxdQLILK55n1DXn/NpaVezFL9LWmoKCaHu\nmQXNdgcC4WbML983PSPrhtxXRkbm5nO9Bv1DIBpIAC4Ab/5WRyHEAiFEKyFEq8DAwN/q9n9iNBpr\nJYTfsWMHcXFxbN++nby8PCoqKmq1R0ZGsmWLex5ss9nM/v37OX3qJGVlZW5tRUVFnE1NxW53oHBY\n2bzp5x1zs2bNao3BarWyd+9e4uPjXbKEhAR2pxe6si7+tAZsS8mhadjPqXR3ns0l7qf3O85dIKGF\n+xfP9ZLQqg07092/OJWSApVCwaGsi27yHal5xDdrekPuKyMjc/O5LoMuhCgQQjiEEE7gY6DN713z\nR3jggQd48MEHSUxM5MKFC6xevZqJEyei1+spKSlBqVQycOBADh48SGZmJq+88gpr166lf//+bNiw\ngeeee46MjAwOHz7M0KFD8fHxwV5ews6dO/jf//5HdnY2e/fupf/dd6PVqJEUElVmK5u/2cSsWbPI\nzMwkNjaWbdu2MWPGDNLT0zl69CgjRoygY8eOxMbGusbao0cPfMLCeWTlPk7nl3D2YhmPJ+3nx4JS\noCZHeuLRNJ5avZ8H2jXm431neG/vjzw987kbslYTH36YnemFvLo1maziCg5nFTJ26R4SWrTiocT9\nbDqdRX65iWWHz/LClmP8++XfrqYkIyPzN+NqnpwCkbhHuYT+4v9PAMuuRs8fSc71xBNPCG9vb+Hh\n4eFKl2swGIROpxVatUrotFphNBqFh4eHMBqNQqvVCm8vL6FTKYWfn6/Q6/XCaDQKnVYrPLQaoVcr\nhValEEZPT6HX64WXl5fQqFVCp1KI7l06i61bt4o+d/YQngZDzbWensLH0yA6duwowsLCRMOGDcVL\nL70kLBZLrbGWl5eLp6c9JSLqhIrwkGAxZdKjYsmSJaJjm1YiyM9XNG0cIxpERohgf18x8O67xJEj\nR657Xa5Eenq6GD9mtAgN9BeNoiLFq7NnC5vNJlatWiXatWwugv19Ra9uXcTu3btv6H1lZGT+HLjK\nKBfVbxn6y0iStBToBgRIkpQDvAB0kyQpgZrT+BnAwzf8m+ZXpKSkUF5ejpeXlyt+uqqqCm8vLxRK\nBZUVlWC14KHzwGK14rBaMNssWJ3gIUCr1VJWWoqHUsIqBGqFEh+jAZPZAg4nKq0GHx9fDDotDRpE\nU1hYSOq5NJQKCX46gKnWeeDp6cnChQtZtPBjPvnoAz54dy4GnY6AwAAiGjSi5GI+kiTRd8AgunTv\nwa6tm0lKXE5xaRkbtmxzy0MDNVExn3zyCc888TgKhYIR942nffv2zJv7NiePHSWm8R08/tQ04uLi\nfnNtzGYz8+fPZ926dWi1WsaMGcOiLxe74tvtdjuffvopq5YuQafVEhefgLmqgoUffYher6/1nEFG\nRubvyd/iYFHTpnFkZGQSGRnJs88+i0ql4t133yUlJYXY2FgGDx7M888/z4QJE+jXrx9Hjhxh9uzZ\nQI1Pe+rUqZjNZl577TUyMzPxVwvMNgeD4qNYcTyLehERTJ/xLBqNhrfeeotLGWlkFhbhafTi3qFD\nWb16NdOmTSMhIYENGzbwySefoHLaiQv142JlNdPujMffoOPT/T+SWljGU92bMXPd93SMCmFC+8YU\nVlTz6tajONQe/HguzZWPRgjBoP79KEk7w8S20Ticgvf2pXA2v5iJHe+gU/0gDmUX8dH+VFatXUfn\nzp1rrY3dbqdPnz6oVComTpxIVVUVc+fOpV27dnzwwQcIIRg6aAAFPx7nkXYNEALm7jiOp1ZNz8Z1\neW9fKosWf0W/G5CqQEZG5s/htjkpWlZWRlBgIF7e3qSmproiU2w2G+3btycvL4/WrVvTuXNnpk2b\n5rpu5syZbNiwgSNHjrjq91VVVRETE0N9vYIzBSUoFRKeXj6c/DHFdRTcbrfTqkULMjIz2bV7N+PH\nj+ett96iR4+fwxBnz57NykXzySsq5Yfp9xLoWTMmIQQjFm1Fq1RSZbWx6sE+rl1yfrmJlnNW8sxz\n/2bWrFlATbHryfePYdejfVEra351mG12Ws1Zxef39aBlvZqHyEnJ5/k4pYz9h47UWp+kpCRef/11\nduzY4frlUlFRQdOmTdm5cycXL17kwVHD+G7yXWhUNetgsTvo8OZqPhjRmUqLjX/vTuNUytk/ryyW\njIzMH+KvCFv8S0hKSsLhdDJo0CC3MEO1Ws2gQYMIDw/nwIEDDBvmnmwqPT2dsWPHuhVjNRgM3HPP\nPZwrraZ53UB0KhV397/bLa+HSqVi1JgxaHU6QkJCKCwspHv37m66R4wYQUGFmbYRwS5jDjVhjEPi\n63Ms7xKjWzV0M5AhXnpahgew4es1LtmOHTvo3yjEZcwBdGoV9zSN4LvzPxeXHdA0kh+Sj7lVaPql\njsGDB7sd4zcajfTu3Zvdu3ezc+dO7m4c6jLmAFqVkn6x9fjufD49Yupw4cIFLl269BufgIyMzN+F\nW96gN2nSBIVCwblz52q1ZWZmUlVVha+vLxkZGW5tPj4+pKam1romLS0NrVLiYqUJk9VGZnp6rT4p\nKSmYzWZUKhV2u52ioiK39oyMDPRaNVklFfz6F05WcSUGtZqMYvcwSiEEmcWVhPyibFxwcDCZ5ZZa\n988oqnD7osgtq8LLYEClqv3IIygoyFUY+5dkZmYSFBREUFAQ2Ve4R3ZJJYEGHZeqzDgFrjTDMjIy\nf19ueYPerl07hMPOwYMHWblypcuAbtmyhXXr1lFeXs6UKVOYMWMGBQUFQI1rJTs7m1WrVrFjxw6g\nxqB+9dVXHD58mB7RQeSVmWhZL4gfDh9m2bKlLr3ffvstG9atRa1S8uILsxg8eDDTpk3DZDIBkJ+f\nzxNPPIHTbEIIeH/3SRw/pfNNzrnEwv1nmN4znnm7TnAir+aLwOF0MnfncUqrrTw36wXX3EaNGsX2\n1Dw2n8l2PaX++ng6e9Ly6RJdY/grzDae2XCYhyZOvKJL5P777ycxMZHdu3e75vnFF1+Qnp5Ov379\nGDFiBLvT8tl4Kst1j/UnM9h7Pp/eTcJ5dsMRRo4YUeuQlYyMzN+PW96HDnDkyBHatW2LRqvFaDSi\nUqkoLS3Fbrfj4VETeVJcXIzdbqdevXrk5uaCEJirq9Hp9fj7+2O1WqmsrMRabUKrVmGx2Qnx0lNs\nsiCptXh6eqJUqSgrLUU4HHh7e1FRZcIpBHq9B1VVJurWqUNWdjZRkZFkZZzHZnegVytBkvAzeHCh\nrAqjXoe3Qc+limrMlmqCPHWUV1uxC3jhv6/w5JNPuc3tu+++Y9yokaiEHafTiUKnp0Wr1mzetIkG\nIf6kFRQxePAQPvx44W9mCdy8eTMPPvggXl5emEwmjEYjS5cudcXH79u3j3GjRqJwWDGbzRRXmggP\n8OViuYnefXrzyedfyulkZWRuYW6bh6KXWblyZS0/+fWi0+kIDAxErVajUCjw9vamXr16xMbGusIj\nfX1rshlcunQJHx8fYmJiiIqKoqioiO+//57AwEBMJhPnz58nJiaGNm3aUFlZic1mo0uXLrRt2xa7\n3c66detwOp0MGDAAnU7nNo4TJ06wY8cOfH19iYqKwmAwYLfb2bt3L3q9noYNG9K4cWNCQkJqzSEt\nLY1NmzZhMBgYNGgQRqOR5ORktFotcXFxtXbzTqeTY8eOIUkS4eHhnD17lvDwcOrUqVNLt4yMzK3F\nbWXQG0ZHk52bi0KhwGg0otPpKCkpwWAw0K9fP06ePMmZM2fQarVUVVXRq1cvVCoVmzdvJjY2llOn\nTqHGwaC4CI7mXCK9qJyejeqyL70AtUIi1MvA6YISvHTqn+T55FRY6Ny5C/7+/mzdupXRo0ez7Ksl\nWKw22rVrx779+2nRogWRkRGsXVtjtIcNG0ZOTg4nTpxgw4YNJCQkXHE+TqeTf018iHVrkujXJJyc\n8mqO5hTRqnUrThw5TJ9GdUgvNfFjYQWbtm6jaVP34/kvvTCL996ZS7/YCMrMNvak5bFk2Qr69r1S\nUkwZGZm/O1dr0H/3YNHNZtWqVVzIz0ej0dC1a1fCw8NZvHgxzZo1Y8OGDWi1WgDeeOMNXnvtNfbt\n20fjxo2BmkiXLl26sGHDBobeey9jWjfk7Xs78u7OE+w4m8vxZ4czdOFmlAroUD+YJeN7YnU4aTon\nifXrN7iyOxYWFhIfH49WrSb52CG6du3KZ5995ipl9sYb5fTo0YNevXoxcOBAli5dypgxYzh58uQV\n/d6JiYkc3PYN30+9x1UL9MmkfRw+eYTvp/ZHp675WL46dJYxI4Zx7NQZl559+/bx6Ufvs+/x/q4H\npwczChg9cgRZuXmuYhoyMjL/PG75h6JPTp2KxWqlf//+bNu2jY4dO2IwGHj66addxhxqMiX269fP\nZcwB6tevz9ChQ9m9ezcPP/IIK5IzAHi40x0czi6k3GxlRu/mJOcWM71nAiqlgp1nc4lv1tQtVW9g\nYCBNmjTh0cmTSU9Px8/Pz60upZeXF4899hiJiYkAjBw5kurqak6ePHnFOS394jMebd/QrbDz+Utl\nPNMzwWXMAUa2aEDJpYukpKT8fO3ixYxvGeUWBdM2MpiE8EA2b958rcsrIyNzG3HLG3SH3Y4k1cSd\nOxwO1071l8YcatwYv5Zd7me329HpdNh+yoColCSUkoTDKdCqlAgh0PwUr253iis+fJQkCa1Wi8Ph\nqJWqF0Cj0WC32119NRrNFePGAew2GxqV+9LbncItHr1GD2iUKjc9drsNrbL2x6ZVKV33l5GR+Wdy\nyxv0WS+9hEat4euvv6Z79+6cPHmSiooK5s2bh9P5c5V7tVrNmjVraiJcfuLixYssX76cHj168NFH\nHzI4LhyAZUfO0TDIh0BPHe/sPE6jIB8+2HMSIQRdG4Rx8PsfOH36tEtPVVUVZ8+eZf4HH3DHHXeQ\nnZ3Nvn37XO1Wq5X58+czcOBAoCak0mKxuKXV/SWDR4xi4fdp2Bw/j79JsA/v7vo5BBLgmzPZKLQ6\nt2yOg4cO44ujGVRafjbyKQWl7E/Lo3fv3te8vjIyMrcPt/xDUSEEQQF+VJrMqNVqNBoNoaGhZGZm\nEhERwbBhwzh27BibN2/Gz8+PsrIyxo8fj0ql4ssvv+SOO+7gxx9/BEs1E9s15Ej2JfakXWBUqwbs\nO59PsclC87oB7DqXR31/LwY1q8/GU5mcKTIxatQoAgMDWbZsGc2bN2fHt99iMBjo0KkT33zzDQMH\nDqR+/fp8+cUXVFRW8uijj5KVlcWGDRtITEykW7duV5yTzWZj6KABpJ08xsDGoeRWWlh3MouoqPrY\ny4q4OyaYjDIzm3/MJelXOVyEEPxr4kNsWfc1w5qGU2a1szI5g7fnvcd948b9kY9HRkbmFuW2inIR\nQjBlyhTee+89l0ySJIQQKJVKHA6HW//LbhkhBAqFAqfTiSTVuFrsToFKqcSg14MkodVo8PH1pVXr\n1sTExLB7104u5OfjafDE6OVFYGAgw4cPZ/DgwRQXF/Of//yH7w8eJCg4GL1eT0ZGBhH16tG6TRvy\n8/Px8fGhT58+1K9fn8rKSvz9/bl06RIhISFuLiGn08nWrVvZ/u02AgKDGDt2LEFBQWzatIndu3YS\nEhrmkl1pPfbt28f6desweHoyevRooqKirnldb0UcDge5ubn4+vq6kpjJyPzTua0M+uXTkEqlEovF\nglarRQiB3W5HqVSiUCiwWq2o1WokScJqtbqMuUajwWw2owAUwo4QoNLqMFtteHh4YLFY3PrV6Hbi\ntNtQCIHT6cQhBBHhdfnm251ERka6xnXu3DkeHH8fyceOI0ngqfegtKIKrVLCbLUhSQqgxievUKqY\n/swzTH9mhpwE6zdYsmQxz06bht1mocpsZfiwYbz7wYfyKVaZfzy3TXKu3bt3s3z5crRaLbNmzUKt\nVrNw4UIuXrxITk4OAQEBjB8/nry8PC5evMiiRYvQ6/Xo9XoWL17MtGnT8PPzo35UFI1C/dF46OnZ\nqxd+fn6MHz+ewMBAWrRowbBhw8jOziY/P58VKxKRlGqmdmtK1sv3kfHSWIY08KdDm1auXwMWi4Ve\n3bvSOwBSnxtGzwYhtAoxcvyZezk3axSrH+qLUavi+T4tUAknb9/Tki8/fJcF8+ff5BW9Ndm+fTtP\nPz6FRUPbcPqZIRydNoii4/v510P/72YPTUbmb8Mtv0OvUyeM8PCaU5wWiwVPT0/mzp0LwA8//MCE\nCRM4fvy4W7bBmTNnkpKSwqVLl9i1axft2rVj1KhR/Oc//0EhwUsv/4c9e/ZQXV1N165deeedd0hN\nTXWLXnnttdfI3LaKtwf+XF2v/ZurefPTxfTr14/ExEQ+eHEGq+/vxsWKatr+bxUnZo5wC0VcdOBH\ndp/Lo2V4ID8WlDKmdUOe2vojp8/emILQtxOD7r6LnoZKxraOccnKqq0kvLGas+kZBAQE3MTRycjc\nXG6bHbrJZEKv17uiS5o3b+5qy87OpnHjxm7GHCA2Nhan0+lK1hUfH49SqcRkMhFeJ4yCggJiY2PJ\nzs7GaDTSoEGDWqGIzZo1I7fC7CaLC/05q2NWVhaNA2oyFOaXmwjzNrgZc4AmIb7kllZxR6gfOaWV\n3BHiR3beBWRqk5WZSZNgXzeZt4eGIB9P1+coIyPzf3PLG/SoqGgKCgrYtGkT7du3Z9WqVa62Fi1a\nsH//fioq3FPVbtq0CafTSbNmzbDZbGzbtg2z2YyPl5H0zGzq1avHN998Q8uWLcnMzOTkyZMUFha6\n6fh6zRoSgr1c7612BzvPXaB9+/YAtGnThm/P5WN3OIkO9CKvrIrMX6XM3XImm+bhgWz+xb+tml85\nHcA/ndbt2rM5JddNllZYRlFF9W3zwFdG5s/mlne55OfnExUVhbe3N127dmXr1q0MHDiQiRMnUlpa\nyoMPPkhAQACzZ8/G39+fRYsWsWbNGiorK5k3bx6LFi2iqKiIzMxMGvt5kF1mxtMvAJ1eT506dThy\n5AhxcXGUlJTw8ssvU6dOHZYsXsyCBQvoGR3E1O7xmGx2/vvNYTSh9dm1bz9QE2nSr3dPREEmUzs3\nZk1yOt/8mMXse9pS39+LtScyWLjvDAOaRrLhVCYPd4zlwwOprPx6HV26dPkzlvdvTVpaGh3btubB\n1lH0j63HucIyXtp6gknTZjD1ySdv9vBkZG4qt1WUy+HDh2nXrp0r7M/pdLoiWkwmEwqFAp1OhxAC\nh8Phym2uVquprq5Gq1Fjqa5GpVAgIbA7BVp9TWZDSaFAIUnY7Hb0en2NbqWC2NhYcrKyuHSxAJ1W\ny6ARI3n33Xlurhmz2cxbb77Jiq++xG53EBMbR0FONllZWYBA/FSc2uF00qJ5C555/t+0bdv2hqzl\n7Uhqaiqv/udl9n63h7DQUCY/OY2hQ4fe7GHJyNx0biuDPnjwYNatW+eKS66qqkKn02GxWFyG3GKx\noNfrEUJgtVqBmgM8np6ebiGODrsdh8WMWqXAIdV8EZjNVjQ6HQiB3WZFp1ISFBaGEkAIbE4nleXl\nlFVWodJoUCpVtGzZkrFjx/Lum/8jMz0NlVpDy7btEXYr2VlZxDdvwdMzn3M75Skjc5ns7GzmvPoq\n3+3aQXBICJOmPsk999xzs4clc4ty2zwUffLJJ9m2bRudO3dm6dKlfPXVV3To0AGlUklERAR33303\nzZs3Jz4+ns8//5zExES6d++OwWAgOjqajz/+mKSkJAYNGkRgYCA9e/VC7+1DXN0QcDowma34+Pnx\n1ltvsW79eh56+BFsTsGFzEyyMtL5V3wIiooiissq0HsaeeON/7FmzRqaNWvGxIkTuStUxbJxPehQ\n14dd326hh6GKub0aEVl6ju6dO3L06NGbvYQytxg5OTm0b90SxY/7+V+PhgwNFkyd+ADvvjP3Zg9N\n5m/OLb9DVyqV1KtXjxMnTrhqatrtduLi4ujZsyfLly/H29ubkydPugpICCFo164djz32GGPHjnXJ\nhg8fTs+ePVmzZg2Hf/ieev5e5Jab2b59O02aNHHd89lnnyVj13p2p2RzX5sYyq1OVp/OZdOmTW45\nzl966SWyd6xl3pC2dHhrNa8OaEu3hj8XjPh43xn22nxYs37jda+ZzO3Hk1Mfx3ZsF//p19IlSyss\no8+CrWRfyJcPUsnU4rbZoSsUCoYOHepWIFmlUjF48GD27t1LeHg4PXv2dKsGJEkSI0aM4Pjx426y\nAQMGcPDgQQYMGECdunU5d6HIlRr3lwwePJj00mokCfam5fNDTjEGg6FWwYohQ4ZwIPsS5WYb2SWV\ndG0Q5tbePzaC/fsP3MjlkLkN2L9nF3c1ca8UFR3oTYiPZ03eIRmZ6+SWN+hQU6rt15w6dYqwsDCK\ni4s5e/bsFa8JDQ11k6WmphIaGkpqaioVZWX4ehkoKCigsrLSrd/Zs2cJMGgx2xyE+egJ8/agrKyM\nkpKSWvpCvPQYNCrUSgU5pVVu7ecKywgNCb7eacvcpoTVqUtaYbmbzGS1c6G4/IrlBmVkrpZb3qAb\njUZ2797NkiVLcDqdOJ1OvvzyS7777jvq1atHeHg4ubm5vP/++9jtdoQQfP3116xdu5b8/HxXXpcd\nO3bw2WefERUVxdKlS1E5rRgUAg+djscff9wVy37q1Cmef24m5eUVaJQKHmx/B0FaJSqViscee4yy\nsjIAUlJSmD5tGuMS6qFSKhjYLJJ/Ld9NcVXNYaSs4gpmfnOUyU/IIXcy7kya+iRzdp7iRF4RAJUW\nGzM2HKJ7j+61NiEyMtfCLe9DdzqdKJVKjEaj60So0+mkuroaDw8P1Go1JpMJjUaDEAKVSoXdbsds\nNqPT6XA6nXh4eFBdXV2TFEsIhHBis1hQKSSEQolSrcHhcODt7U1ZWRkOqxWNSoFapcLucCABAoFQ\n1RTL8PHxobKyksYxDTl18gTeOg2lJgs6rRqHE0L8vCmqNPHUtOk8+9zzcjIumVos+vRTZj4zHYNa\nSVGFiT59erPg08/w8vL6/Ytl/nHcsLBFSZI+BfoDF4UQcT/J/IDlQCSQAQwXQpT8lo7LXG/Y4pEj\nR2jZsuXvd/wdFAoFSqUSSZIIDg4mICCAc+fOATVl5urVq0d6ejqXLl1CkiSCgoJo0KABXl5eZGZm\nUlpaioeHB3Xr1qV9+/Z07dqVPXv2cP78eeLi4jCbzVgsFtq2bUuXLl3Q6/W1xmAymVi1ahXnz5+n\nefPm9OvXz+35wGXsdjsbNmwgOTmZ6Oho7r333n/cw7LCwkKWL19OSUkJPXv2pF27dtf95SiEYM+e\nPezcuZPAwEBGjBiBn5/fDR7xtWG1WklLSyMgIIDAwMDf7FdcXMyKFSu4ePEiXbt2pUuXLvIm4R/G\njTToXYBK4ItfGPQ5QLEQ4jVJkmYAvkKIZ37vZtdj0IcPH05iYiIGg4HGjRvTs2dPduzYwcmTJ3E4\nHPTr14+IiAhWrFhBYGAgxcXFeHp64unpyalTp2jevDmnTp0ixteDarOZwiozFWYrNiGh0eoYM3o0\ndpuNZcuX47BZ0SoVDG8RTZXVzroTGfjptRSbLIxo0YC88iq2p+TSPSYMs83BgZxi7r13KL6+vixe\nvJhIbx0t6/qz5kQmz7/wEo8/8YTbXM6fP8+dXTsT46enWaAnOzOKkLz82LpjF97e3q5+ZWVl9OzW\nBamyhK4R/hy7WMnZEhPf7trzjzkGv23bNkYMHUKvRnUJ1qtZeyaXLnf2ZtGXi2vl7vk97HY7o4YN\nJfn7/fRvHEpOhYWdZy+wet16OnXq9CfN4Mawb98+Bg4cSPfu3YmIiGDt2rU0bdqUZcuWXXEjIHN7\nckMPFkmSFAms/4VBTwG6CSEuSJIUCuwUQjT6PT3XY9C1Wi0ajYZx48bx5ptvuuQzZ84kKSnJFRVg\nMpno2bMnU6dOZdGiRQwcOJCsrCwWLlzI6dOnadOqFQsHt2BVcjrZJRUcyCsnOTmZsLCayJSMjAxa\ntGjB5od70zTMH4DUi6X0fn89g5vVx+50Mm9YZzadzmLG1wcotwm+2fatq8xcaWkpndq25u2+TYn0\nN9L9/Y18f/SYmwHue2d3OniYmNI1DqjZNU5OOkBohz787623Xf2enPo4Fw9sZd6Qn3ek7+w6yUGL\nJxu3fntN6/d3xGq1ElEnjIX3tqFjdI1P2WS1c/fCbcycM5dhw4Zdk75PP/2Uha+9yOoJPdCqamrH\nbj6TzYytpzmXkYnyp3qytxpOp5OYmBhef/11V1Fyq9VKv379mDBhAv/v/8mphf8p/Nlhi8FCiAsA\nP/1bu6zODcBqtbpe06dPd2ubNm0aubm5rrqier2eRx55hLVr1zJlyhRWr17Nk08+SXV1NQcPHuTh\nf/2LtadzmNKtKXvS8hl3330uYw4QGRnJ4IED2J/+c2a/mCAfejSsQ0yQN1+fyACgb5NwbA4nrVq1\ndKsZ6uPjwwMPZH48/QAAIABJREFUP8LXp3MI9/VkYNNIVq9e7WqvrKxk9959PNShsUsmSRKTOzZm\n5YrlbnNLSlzBY52auP2sntihMTv3fEdVlXskze3Ivn37qOutdxlzAL1GxYOto0j8avE161v51WIe\nbtvAZcwB+jQJR4vjlj74lZycjEqlol+/fi6ZRqNh8uTJrFix4iaOTOZW5U+PcpEkaaIkSYckSTr0\n64yG18Kvf0lc6ZeFEMJVmu6X/0qSVFOGjhoZ0m9fX0v2U04WCekXMuBKfZ2CyzZYwFX5Oa/YT5IQ\n/Hq+v6vqtuJK073aNf01kiTV0ieEcP193Kpc/rv9Nbf6uGVuHtdr0At+crXw078Xf6ujEGKBEKKV\nEKLV//Xg50poNBrUajVqtZrXX3/dzeDOmTOHOnXquPypVVVVfPjhh9xzzz3MnTuXQYMGMWfOHHQ6\nHa1atWLBRx8x4I66zN1xnM5RoXy5eDE5OTkufWlpaaxZu4729X+OGz+TX8KOs3mkFJQwsGkkABtP\nZaFTKjl0+Ijb7q6kpIRP5n/EwDvqklVcwdcnMhg8eLCr3dPTk26dO/HR3jO/XBve3XOGocNHuM17\n6PARvLPnjNt8P9x7mu5du2AwGK5pDf+OdOjQgbzyanafy3PJqqw2Pv4+jWGjx16zvmFj7uOjA+cw\n2+wu2abT2dgVarf8+rca8fHxCCFYu3atS2axWJg3bx7Dhw+/iSOTuVW5Xh/6G0DRLx6K+gkhnv49\nPdfjQ58wYQKfffaZKzfL5Yeiqamp2Gw2evXqRUREBKtWrSI4OJhLly7h7e2NVqvl7NmzxMfHc+rk\nSWL89FSZLRSbzJRVW3EICbVWy/BhQ7Hb7axalYTDZkWjVDAkIQqTxcamM1n4emgprbZyb0J9cstM\n7Em7QJfoUCx2Jwdzihk4cCC+vr4sW7qU+r564sP8WHsyk5dfmc2kyY+5zSU9PZ2e3boQYdTQLMjI\nroxLeASE8M227W7hauXl5fS5szuWogK6RAZw/GIFWZU2tu3c7VbT9HZm+/btDB8ymG4NwwgxaFh7\nOofed/dnwSeLrvmhqMPhYOzIEXz/3S76NQ4ju9zCvvQCvt6w0ZXf/lblwIEDDBw4kI4dO7oeirZu\n3ZrFixfLD0X/QdzIKJelQDcgACgAXgDWACuAekAWMEwIUfx7N7vesMVjx47VOnZ/PahUKhQKBQ6H\nA6PRiMFgoLS0FIPBQGRkJD4+Ply4cIHMzEwcDgehoaHExcWhVCq5ePEilZWVhIeHU6dOHerWrUtE\nRIRrlx8fH8+pU6eQJIkhQ4b8puG1WCysXr3aFbbYrFkziouLiYmJcaUHhhojtHnzZpKTk4mKimLw\n4MFu7f8ELofrlZSU0KtXL1q1+t2/599ECMGBAwdcYYvDhg1ziyy6lSkrKyMxMZHCwkK6du1K+/bt\nZZfLP4zbJn3ulClTWLBgAZIkERgYSGFhIWq1Gp1O5zosZLVaMRqNVFZWIoRAo9G4UutqtVrMZjM2\nmw2VSuXyqV+WW8xmdFoN2K1IkoRdUqH9SbfBYKC6uhp/f3+qq6tp2rQpn3/+OQsXzOeduXMJ9TGS\nV1LG6NGjmTvvfTQazVXPq7S0lAkTJrBr1y6CgoIoKSlh9uzZcuSCjIxMLW6b5FzvvfceYWFhJCcn\nk5qaSkZGBl27dmXo0KHk5eXx1FNPufzKl90u9erVQ6fTsWnTJjIzM/nqq6/Q6/XodDqee+458vLy\nyMzMZMmSJRi9vOjatRvdGkei0mhp36EDPXv2ZMuWLUiSxNdff01KSkpNRZ2OHenatStrvviE7x67\nm32P3cXRaYM5t287/35u5jXNa/z48QQFBZGWlkZycjIbN27kpZdeYvv27X/GMsrIyPwDuKV36BMn\nTmTZsmUsWbKEXr16ueT5+fkkJCSQkZGBVqvljjvuoE2bNoSGhtK5c2cef/xxiouL6d+/P1988QUA\nQ4cOJScnhwMH3LMfPvHEE3h7e/PevHfp17cPW77dwZkzZ5g9ezZGo5FZs2a5+gohiImJ4Yk29Xig\n3c/hh1kllXR7fxMXi4qvyq+Zk5NDQkIC586dc8sS+emnn7J9+3ZWrlx51WskIyNz+3Nb7NC//fZb\nnE4nDRo0cJMHBwejUCgoLy9HkiQaNGiAVqslPz+fBg0aYDKZ8PHxISMjw3WN0WispQegQYMGlJSU\n4O3lhZevP0ajEV9fXwoKCmjYsKFbX0mSiIyIQKt0X7a63gaqzWbMZvNVzaugoIA6deq4GfPLY7lw\n4cJV6ZCRkZH5Nbe0Qf/888+RJMntgA7Anj178Pf3JzAwkLKyMvbv309OTg7t2rUjKSmJkJAQSktL\n6du3L1Czs05LS2PHjh1uqXIvh4SFhoZiqTZx/MghhBAcOnSIdu3a1bpvUVERR48eJb+82k2+LSWH\nhlH1rzqksEmTJuTk5LjyyFxmzZo1dOjQ4arXR0ZGRuaX3NJxT506daKyspL//ve/lJeXc9ddd3Hs\n2DFeeuklJk2axNq1a5k1axY+Pj5kZ2eTmZnJ/Pnz0Wg0OJ1OoqKi2LVrFx9++CGlpaVIksSdd97J\nv//9b4xGIx999BEXLlzgvXnzuDeuHvuyC/D3D2T48OFMnz6d06dPu45YFxYW8tprrzF8xAjmr0lC\nSBLdGoRwJKeIN3ee4rOvll115IFer+fFF19kwIABPP/889SvX5+kpCTWr1/PwYMH/+RVlZGRuV25\npX3oULOLVihqijl7eHi4UudeLghtMplQqVSo1Wrs9pqDI2azGaVSiV6vd0XBqFQqysvL8dDp0P5U\nWNpmtaJWKdHpDShsZuwOBz6BISiUSkwmE2q1moCAAGw2G/7+/jzwwAOMHDmSH3/8kf+9/irHjhyh\nQUwMT0x/hrZt217zemzcuJEPP/yQ/Px8unTpwlNPPeWWjkBGRkYGbhMfOuA6jel0OnE4HDidTtRq\nNeXl5VRXVyOEQK1Wu+SXww21Wi1CCKqqqlzJlwwGA5JCQWlpKTZzNQqFAiEpsNlsOJRqhEJFq+bx\nrFmzhqysLL777jvi42LJy0zn+717mPToo4QEBzNp0iSGjRzNoeMn+WrFSvbt20uwvx8+Xka8vIyE\nhoQQHOCPj6ceb70OP08POnfs4PKP22w25rz+OjOeeoIfTxyjU4f2PPvsszfNmFssFl7573+Ja9SQ\nRlGRTH/qyVrVmWSujBCCL7/8kg4dOhAdHc348eOvWEFLRuav4JY36K1atcLT05MWLVqQlJTE9u3b\nGTNmDN7e3igUCjQaDTNnzmT//v3Mnz+f4OBgEhIS2L9/Pw0bNqRTp06sW7eOLVu2MHjwYLy9vdHr\n9QSGhKI3GJg0aRLbt2/nk08XERYawoUTP9C1YwcOHTpEhzatUaZ+z8u9m6HSaHjxpZfYvmMH999/\nPw899BArVqzgycen8PJzM6m2WHh25nPs27efd959F4VaQ0N/I+sm9mXFhJ5oL2URf0djzGYz940a\nyTeff8ScHg1ZNKQlZYe207VDe0wm01++vkIIhg0exJ4Vi3irV2MWDkzgwt5v6NGlExaL5S8fz9+N\n2bNn8/rrr/P000+zevVqoqKi6Ny5s9sDeRmZv4zLSYr+ilfLli3FtRAQECDUarXw9fUVJSUlorq6\n2vXq37+/0Ol04tVXX3WT//DDD0Kv14tt27aJqKgoUV5e7mozmUyiS5cuIjY2Vmg0GvHoo4+6XZuR\nkSF8PA3i8e7xol3rVuLeFg1FyZwHxJ1xUWLBggVufbdu3Sqio6OFXqsRIX7eYvYrr7i1Hz58WAT7\neomC2eNFyZwHROGr94s63gbxyCOPiDB/H5H/k/zyq2+zBmLBggXXtD43ggMHDoj6wQHi4qv3u8ZS\n/PoE0bVJfbFkyZK/fDx/JyoqKoSvr69ITU11++ynT58uJk+efLOHJ3MbARwSV2Fjb+kd+uXKQZ06\ndaoV4tenTx88PDzo06ePmzwuLg6tVsuOHTu48847UavVrjZJkujduzdBQUHodDpXFMxlgoODadQw\nmkhfA1nnz9E7psYFcjTrIr1793br27FjR/Ly8gjw1IOkoM+vdN1xxx1otB7kldWku1UpFfRqXJft\n335Ll4Z13FK5AtwZFcgP+/ddxyr9MQ4dOkS3BqGofxGKKUkSd0YF8P2B/X/5eP5OpKSkEB4eTnh4\nuJu8d+/eXE+KCxmZP8otbdChxnd+4sSJWqltT5w4gd1u5+TJk27ygoICTCYTjRs35sSJE7X0nTx5\nkqqqKmw2W612s9nMufRMSk0WvHz8OJlf40cO9/eudZ+0tDT0ej2l1WZUCkUtXRcvXqSispIAz5/L\nxiXnFhEVHc2pCyW15nO6sILI6Npx8n82ERERnLpYVkt+qrCKyKjov3w8fyfq1KlDdna2Wygs1PyN\nRURE3KRRyfyTuaUNekVFBUIILl26xHPPPYfJZMLhcJCYmMiyZcuwWCxMmzaNI0eOAHDhwgXGjx9P\nbGwsgwYN4uLFi8yePRuz2Yzdbufzzz9ny5YtHD9+HB8fH+bOncuOHTsQQlBSUsJjj/6L2BAfPv7h\nPP9++T98dTSDjacy+VebaJ54bBKnT58GICsri4cffpgpU6bQpm1bSsrKePbp6Rw+fBioOck6btw4\nWoQHoFMpMdvsvLX9GOcKy/jkk09QeHrzytZkTFY7DqeTlUfTWH86hwkPPPCXr3Hfvn0pc6r4347j\nmG127A4nXx06y860fO67776/fDx/J0JCQrj77rt59NFHuXTpEkIIvvvuO+bMmcPjjz9+s4cn80/k\navwyN+p1rT50IYRo3LixUCqVwmg0Co1GI/R6vTAajUKn0wm1Wi10Op3Q6/XCy8tLaLVaodfrhVar\ndb03Go1Cq9UKnU4njEZjTbtGIzwNBqFWq4Wnp6fw9PQUGo1G+HgZRXhosFi69CshhBA7d+4UjaPr\nC0+tWmjUKuHh4SF8fHyEj4+PeP7554XdbhclJSWif98+wkOjrhnHT/fTe3gIo1YldCql0KqUIsTX\nW2zYsEEIIUReXp7o37e3MOo9hI+nXrRsFicOHjx4zWtzo8jMzBR9enQXRr2H8DboRdsWCeLo0aM3\nbTx/J6qqqsRDDz0kvLy8RGBgoIiOjhYrV6682cOSuc3gKn3ot3wcOtT4dC/nwL6cLRFwxZ1LkoRa\nrcZms7ne/7LSy+XqRRqNBpvVis5DR1RkJB06dqJd+/b8cPAgeoOBu/v357vvvmP9+nV4e3vz4osv\n0aFDBwoKCjCbzeh0OpxOJ35+fthsNj788EMWL15MRXk5LVq25OGHHyYsLIzo6GiqqqqQJIni4mKE\nEBQXF7N69WrUajUjR44kLi6O0tJSLBYLwcHBXC3p6eksXryYsrIy+vTpQ8+ePW9IKlW73c6yZcvY\nu3cvkZGRjBs3jtDQ0N+/8E/AarWSlJTEwf37qBdZn/vuu4+AgICbMparpaqqirKyMkJCQq45X7uM\nzO9x28ShazQaPD09adiwIQEBAQQFBTFt2jQmT56Ml5cXHh4e3HPPPbzwwgu0bNkSb29vNBoNgYGB\nGAwG6tSpg8FgoG3btrzwwgsMGjwYkNBWXsKUvIvHHnmYkkPfYjq0jcEDB/D5559xzz0DiIyIoHfv\n3jz//POEhIQQGRlJSEgIYWFhXLhwgUaNGrF161ZGjRpFw5gYvt22jSFDBnPx4kU8PDwICAjA39+f\nhg0bMn/+fEaOHIlKpcJsNtOzZ0/mzp2Lj4/PNRnzxMREWrduTX5+PkajkalTpzJy5EgcDscfWmOz\n2Uzfvn155513qFOnDmfPnqVp06bs2LHjD+m9HsrKyujQpjXvvTgD33MH+H75QmIbxbjcWbcqBoOB\nsLAw2ZjL3FyuZht/o17X6nIBhE6nE6+88oqIj48XdevWFXl5ea7wsNTUVOHp6SmmTJniCkscMWKE\n6NWrl9DpdCIhIUEYDAYxZswYYTKZXNfNnz9feBuN4rsnBon1D98lQr30YmzrhiKhWTNRVlbm6rdr\n1y7h4aETJSUlbuMaOHCgeOGFF9xC1aZNmyYaNWokwkKChdPpdPU9cOCAiIiIEBcuXHD1TUlJEb6+\nviI7O/uq16KyslL4+fmJ/fv3u/SUlpaKli1biuXLl1/Tuv6at99+W/Tp00dUVla6dK9du1bUr19f\n2O32P6T7Wpk5Y4YY3rqRKH59giuM8qORXUTLZnF/6ThkZG4luB3CFqEmBGz//v1EREQwZswYfH19\nXW3h4eHcc889JCUlATWulalTp3L8+HHi4uIoKChAr9czadIkN7fEmDFjsDscJB5No2N0KP4GHbsy\ni5kydapbkYo2bdoQVT+KTz/91CVzOp1s3LiRyZMnu41z0qRJ5OXlUVllcqtVumbNGkaPHo2Pj49L\nVq9ePfr168f69euveh327NlDbGysW+UmrVbLgw8+yJo1a65az5VYu3YtjzzyiOtELUDPnj1RqVRX\njBT6M/k6aSUPt4tx+7yGJkSRkZFBbm7uXzoWGZm/G7e8Qa+urkatViOEuGJ62su5XH7ZX6lUUl1d\nc7RfkqRa19lsNpxOJ1qVskavzY4Crqj/su/8MpIkuVwnv+6nUqlAkty+FNRq9W/qvZYKR2q1+oon\nN6urq69Jz5W40nyEEFgslj+s+1pRq1WY7e4uJLtTYHc43c4UyMjI1OaWN+i7d++mVatW/PjjjyxZ\nsoTMzExX27Fjx9i6dSv3338/UGOoX375ZeLj40lPT8fb25uqqipmz57temAK8Pbbb6NWqxjdqiFJ\nx9IBGBJbh9dff42ysp9jstetW0dBQQEPPvigSyZJEiNGjODFF190xZI7nU5eeeUVfH18CPDzdfOL\njxw5sta4k5OT2b59OwMHDrzqdejSpQs5OTls2bLFJSsuLuaDDz5g1KhRV63nSowePZq3337bLfXA\n4sWL8fHxoUmTJn9I97Uyatz9vLX7DNZfGPWP9p6hZYvmBAUF/aVjkZH523E1fpkb9bqesEVAaDQa\nER0dLTw9PYXBYBCDBg0Sffr0ETqdTuh0OtG0aVMxbtw4ERwcLPz9/YVWqxUBAQHCYDAIT09PYTQa\nRUhIiBg3bpyIi4sTer1eNAvzE20jg4WHWiX6NI0S/eIbCE9DTUjk6JEjRedOHYWHh4dYuHBhrTFd\nunRJxMfHi+joaDFu3DgRFRUlvL29ha+vjzhz5kyt/vPmzRO+vr5i1KhRYsiQIcLX1/e6Qtv27Nkj\nAgMDxV133SXGjx8vAgMDxTPPPOPms78eHA6HmDBhgggLCxMPPPCA6N69uwgPDxcnTpz4Q3qvB4vF\nIgbfc7eICPIXEzrGiXYxEaJBZIRIT0//y8ciI3OrwO0WtvhrfHx8iI6OxmAwUFBQgBCC1NTUq9Ln\n7e1NWFgYzZo1o2fPnnz77bdoNBr69etHSkoKhw4dIjIyklmzZv1muJzT6WTr1q3Mnz+f4uJi+vXr\nx9Rf+eB/SW5uLhs3bkStVjNgwAD8/PyufgF+QWVlJevWraO0tJRevXpdsQrT9XLixAn27NlDcHAw\n/fv3R6vV3jDd18oPP/zA999/T7169ejbt6/sbpH5R3O1YYu3vEGXfvJJe3h4oNPp8PT0JD8/H4vF\nglqt5q677mLBggWUlpbStGlT9Ho9VqsVm81GVFQU58+fR6vV4nA48PHxQZIkioqKCAgIoKKiAofD\ngcViRul0EO5rJKukArVazZ133snnS5ZiNBr/pNWQkZGRuTpuizh0SZIwGo0EBQXxyiuvkJ6ezsmT\nJ9m0aRNeXl54enqSm5vL008/zZdffsnAgQPJysrimWeeoUGDBhw6dIhjx45ht9v59NNPSU1NJTU1\nlaVLl2IymUhOTubRRx/Fw0OPVqdj9UN9+X76vQQZNBSeSeaxfz18s5dARkZG5qq5pXfoHh4eDBky\nhLNnz7J79263tueee47U1FRSUlLIycnBx8eHbdu2ERUVhRCChIQEFi5cyOnTp9m4cSPLly93u/6B\nBx6gdevWTJw4kYiICBo1bEhvPwePd2vKquTzLP4+lcN5JeQVXMTT0/OGzF9GRkbmergtdugajQaD\nwUDdunVrtdWrVw/AdcR+48aNREVFATU7+/DwcIqKirh06dIVM9/Vq1ePoqIilEoloaGhqDQaikxW\nAMJ9PSmttqBVq6ioqPgTZygjIyNz47ilDXp5eTnHjx9n586dFBcXu+ROp5PExERKS0uJjIxEr9cT\nExPjas/NzeXQoUO0bt2aLl26kJSURHV1tavdYrGwevVqunTpwrlz5zh37hwXsjLpVL8mLG5V8nki\n/Y34+fsTEhLy101YRkZG5g+g+v0uN5dTp04RGhpKly5dmDFjBt7e3nz88cdkZmZSVFRUUxdUCIYM\nGcLEiRMpKCjg5ZdfplWrVhw9epRt27ZRUVFBjx49eOKJJ1Aqlbz99tsEBQVx+vRpxowZg8GgR+Mw\ngwRTEvew6Uw2Qqnm8yVLb0jiKxkZGZm/glvahw4/hyzq9XrUajWSJGGxWLBareh0Oux2u6vP5WyI\nFosFhUKBTqfDbDajVCpxOp2oVCokSaK8vBwfb2+QpJrC01YzGpUKD50OnV5Pm7btmP7sTJo3b37D\n10BGRkbmWvlLfOiSJGVIknRCkqRkSZL+tJpbRqMRp9OJw+HAbDYjhECn0/18hF+rRQiBw+HAarW6\njLzD4ahJWKNQuPrabDa0Wi12h4PKykqEENhRYFeouFRRRV5hEavXrefOO+/Ew8MDX19fevXqRUlJ\niWs827dvp1vH9vj7eNE6oRmJiYl/1tRlZGRkrpob4UPvLoRIuJpvj2tFkiQ8PDx4/PHHOXHiBFu2\nbKFDhw7Ur1+fgIAAlEolCoWCZ599ltTUVFasWEFYWBje3t7odDreeOMNUlJSWL58OfXr12fQoEF4\neHgwf/581qxZQ0xMDL179yY1NZUFCxZgNBqZPHkyBoOBOXPmkJKSwpIlS0hLS6N58+bY7Xa2b9/O\nqKFDuC9Sx8HH+zO9RQhPP/YvPlu06EZPX0ZGRubauJrjpL/1AjKAgKvtf61H/3U6nRg7dqxbmtqi\noiIREBAgmjZtKjp37izq1q0rZsyY4Wo/fvy48PHxEXPnznW7Ljk5WQQFBYkvvvhCdOjQQVRXV4v0\n9HTh4+Mj8vPzRXV1tVi9erUICQkR77//vtu1hw4dEp6eniIxMVF069heLBzdzZXatWTOA2LLpP6i\nfnidP3wEX0ZGRuZK8BelzxXAFkmSDkuSNPEP6qqFh4cHvXv3dpPp9XratGlDdHQ0AQEBKH5VoLlh\nw4Y4nU66d+/udl2jRo1QqVQ0btzYVfA5JCSEiIgI0tLSAOjWrRsVFRV069bN7drY2Fg0Gg0HDhzg\n+MmTdG3gXsmnVb1ACgov1SoWLCMjI/NX8kcNekchRAvgLmCSJEldft1BkqSJkiQdkiTpUGFh4TUp\nt1qtHDx40E1mt9tJTk4mLy/PFSMeHf1zdfrc3FwUCkWtCjc5OTlUV1eTnZ3t6l9WVkZmZibh4eEA\nHD58GL1ez68f3GZmZmI2m2natCnR9etzJPuSW3vKxVK8jZ4YDIZrmp+MjIzMDeVqtvFX8wJeBKb9\nX32up2LR5YyH5eXlIjMzU4wdO1Y0adJEhIaGCp1OJ7RarVi4cKEwmUzixIkTok2bNiIoKEiEhISI\nTZs2ueQdOnQQ9913n4iIiBCfffaZSElJEd27dxeDBg0S1dXVYu/evSIqKkpMmjRJ1KlTR2zevFmY\nTCZx/Phx0apVKxEYGCiqq6vFypUrRWSwv/jm0btF8esTxL4nB4uEyDDxxpzXr+eXlIyMjMzvwp+d\nbVGSJAOgEEJU/PT/rcDLQohvfuua6w1b9PLywmQyuYpLXC4abbPZsFqtGAwGV4EJpVKJ3W7H4XC4\nwhZVKpUr2gVq8qYrFAqX3G63u7L5Wa1WhBDo9Xqqq6tRqVRER0ezbt066tevD8Dnn33GS7OeJ/9i\nIT5eRp6c/jRPTZsux6zLyMj8Kfzp2RYlSYoCVv/0VgV8JYR45f+65o/EoXt4eOBwOFCr1S6j+8ux\nK5VKJEnCbrfjdDoRQqDVarFYLHh6emK1Wvn/7d17VJTH3cDx7yyw7LKwSkFwgyJoGxU1KJFELtrW\nhmhiY7BiqzWKBhNj0hytsdGYvI2t+tb3bXwbL0naeKnxrrE2mhwrEO8KMRovSRQVFSUqN+V+2Qsw\n7x+7bEWNVVCBZT7n7NlldhZmfufZ33mYZ2Yeq9WKRqNxTnP08fHBaDSSm3MFNzc3jD5G2ptMeLhp\n0HhoqbbZ0Ht64K71xBQYyFM/f4aEhATnHZQqKirw8vJq1I2B09PTWbtqFTablfjhCcTExLB69WoO\npR+gU+cu/Hr0c+zatYuDB/YRFNyJpAkv3HIrA4CTJ0+yYvlyCq8W8MTgpxg+fLjadlZRXIBLbJ8r\nhMDLy4uwsDBOnz7N+PHj6dKlC+vWrePUqVNoNBr0ej3FxcV4e3vToUMHsrKysFgsdOnShZKSEkJD\nQxk+fLg92a1YgZSSt99+G5vNxnvvvUdpaSnR0dH84he/YM+ePXz22acEmR5i0iuvkJeby9IP/4bJ\ny52r5VU85OdLmw4h/Ct1xz3ZK3zOH//Ah4sXMq5vZ3RuGlYevUBRhYW+we2I+2EAR3OK2Xz0LI93\nDmJINxOZ1yr4+HgWH/9zy00XbtetW8vklycxpm8XTN46/nHiMl6mYLalfN6k+5oritJ4LpHQfXx8\nmDBhAmvWrGHTpk089thjgH0vl4SEBL744gvc3d2ZNGkSCxYswN/fn1mzZjFx4kTCw8MJDQ1l6dKl\nzrP85ORkRo8eTVZWFj4+Ply7do2ePXvStm1bMjIyAFi8eDHJycl8+umnAGRmZjIguh/DenZEIwTn\nSyz88tXXeemllxoVi6ysLPqGP0L6lGcI8NEDUGG10e+dzfz1VwOI6WJi9vbDXC6u4INfDXD2YfvJ\nbGbtO0fyDmSpAAAQ00lEQVRG5jlnWWVlJcFBJv457qf0esgPgJraWhI+2sPIydOZOFFtA6woLZlL\n7LZYU1NDVFQU/v7+zmQOoNFoSEpKIiAggLCwMPbt20dQUBD9+/fn8OHDDBo0iBMnTpCUlFRvXPvJ\nJ59Er9ezdu1aAPz8/Bg2bBjZ2dnOOklJSezevZvq6mrAPg3y0T596B7oy+enLzGmTye2fbK50X1L\nTk5mcI9OzmQOYNB68Fzkw6ScvgRA6qlLJEV1r9eHQd07UlZczPnz551lBw8epEs7X2cyB3DTaO5Z\nWxVFaRmadULXaDTU1tZSVlbGjf9J1N3M2WazYTAYKCsrw2KxYDAYKCoqws3Nrd4Nn+vqms3mereV\nq6tbp7S0FE9Pz3rj4iUlJdRK8NJ6UFJlxeDd+LsYeXl5UWqx3VReXGXB4GHfM03v4U6J2VrvfWtN\nLVVWK15eXvV+V0mV+eYYma0Y1B2XFKXVaNYJ3WazsXTpUucOi3UKCwv585//zHfffcexY8fo2bMn\ntbW1pKSkEBISwsGDB3niiSeYN2+ec7GPlJK//OUvaDQa4uPjATh8+DApKSlERkYC9qGcmTNnMnTo\nUGdC37JlCzmXL7E9I5uf9wjmvS8yGZs0odF9e/bZZ0k7n0N6Vq6zLDO/hNWHMhnS037R81cRXfjv\n5CNUWG3OPizae4JHIyIwmf69uCkyMhKp1bPhyDln2dXyKt5Lz2Ts841vq6IoLUOzHkN3c3PDy8vL\neQbdvn17QkND2b9/P7W1tVitVtq0aePcfbFDhw5cuXLFOURhMpkoKCggJibGvud5Tg5ms5nY2Fgs\nFgvHjh1zXnjt168fhw8fxlxVidVqIzomhqsFBZw/dxaqbbQzGiissvLq5Cn8cc5tJ/PcsZSUFEaP\n/CW9HvJH56Eh/dwVeoT1JPNMBv1/GMSJnEJKLdVYLRZ+3LUjZ/JLkHpvtqV87lwMVeebb77hmacG\nEejlgcnoxd4z3/Hq5Cn8Yface9JWRVGajktcFK1zr+Z3e3h40KZNG65evfof6/r6+vKzn/2M/v37\nc+bMGfz8/EhKSnLeKanOlStXOHLkCB07diQ8PPyu21RRUUFKSgo2m424uDh8fX3JyMjgq6++olOn\nTsTGxnL27FkOHjxIhw4dGDBgwPdOk7TZbOzYsYPCwkIGDBhwyzs9KYrS8rhEQq9bSKTVagkKCsLb\n25uMjAx0Oh1VVVUIITCbzeh0Onr16kV2djbFxcVoNBq6du1KZWUlly5dIjAwkJycHOcYc91Coocf\nfpjc3FwqKyvp1auXc6ZL3QXRugVIkZGRFBYWYrVa2bx5Mz169EBKyWtTJvP35cvp29nEmdxCOnX5\nEZu3flZvjF5RFKWxXGKWC4C7uzsrV67k66+/Ji0tjd27d1NTU8OQIUNwc3NDp9Nx4MABdu7cibu7\nOzqdjs8//5z09HSOHz/O2rVrKS4uZvPmzWg0GoKDg/H09GTXrl0888wzREREkJ2dzc6dO7l48SJx\ncXH06NEDk8lESEgIQgj8/Pz48ssvmTZtGvHx8dTU1LBs2TL2fLaZo9Pi+fi5ARyZOpRHPM28MD6x\nqUOmKEor1WwT+rRp09DpdPTp04chQ4Y4y8PDw0lMTGTHjh2MGDECq9XK2rVr2bdvH0IIRo0aRURE\nhLP+oEGDCA8PJzc3l/j4eM6dO8fYsWPp3bs3H330EXPnzkWvt08d1Gq1/OlPf+LkyZMUFBRw7do1\nunXrRkpKCkIIxowZg8FgYP/+/Sz/6/u88dMetPWyL9px02iY+UQ4u3bt5tq1aw82WIqiKDTjhJ6a\nmgpwy5s0BwYGYrPZCAwMBCAvL4+SkhJ0Op2z7Hrt27entLSUoKAgNBqNc4ZIaWkpAQEB9er6+/tT\nWVmJ0WjEaDTStm1bbLZ/Ty8MCAigpKSEktISArz19T6r93BD7+nh3AVSURTlQWq2Cf348ePU1NSQ\nmppa74zXarWyevVqevbsyYYNG/D09OTFF18kJiaGnJwc1q9fj8VicdYvKioiOTmZqKgo1qxZg1ar\nZcWKFVgsFgYOHMiqVavq/d1169bRp08fqqqqKCoq4tChQ3Tu3BmA7OxsDh06RGxsLHGDn2LtkfP1\nPrsr8wo+bdredOFUURTlQWj2F0V1Oh2+vr68/vrreHl58f7775OVlYWfnx/5+flUVVXRv39/xo0b\nx4YNG0hPT6dTp068/PLLmM1m3nnnHbp168aFCxfIzc11btgVEhLCiBEjePfddxk6dChxcXGkp6ez\natUq50XRurqvvfYa3t7eLF68mKlTpzJlyhRyc3OJffwxHg00MPjh9pwqKOXvX55l1fqNDBo06H6F\nUFGUVsglZrnAv6csGgwGPDw8qKysRKvVYjabqa6uds5RNxgM1NbWYrFY0Gg06HQ6586L7u7ulJeX\no/f0BI3GuRWv0Wh03lhap9NRU1NDdXW1c6tdrVbLhAkTyM7Oxmg0Mn78eGJjY51tKyoq4sMP/8aX\n+/fRoVMIL73yG7p3737vAqYoisKdJ3T3B9GYhpo7176Ap02bNs7l/xqNxrltrU6no7y8HB8fH8rK\nyvD29qa6uhqDwYDVal8ybzab8fb2RqPRINzcqKqqwujjg9VqoXevXuRdvUpmZibBwcG8+eabjBw5\n8o7b5+vry/TpM2D6jPvSf0VRlLvRbMfQAd566y0MBgMLFizg2rVr7Nmzhx49etC1a1dmzZqFlJJ2\n7dqxceNGiouL2bRpEyEhITz33HPodDqMRiNLlizh448/xt/fn3HjxlFUVMTfV6zAw8ODzHNnWbBg\ngXMrgRkzZrB+/fqm7raiKErD3Mltje7V425uQefu7i4NBoOcN2+erKqqcj4uXLggdTqdPHDggDSZ\nTHLbtm313k9JSZHdu3eX8+fPlwMHDpRhYWGyqqpKbt++XZpMJme94OBgmZqaWu+z27Ztk4888sgd\nt1FRFOVB4A5vQddsz9DrVnNGR0fXKw8MDCQwMJD09HTy8/Nvej86OppTp04RHR1NXl4eGRkZSCmJ\njo4mN9e+EZaUkuzsbKKiom76bN1qUUVRlJam2SZ0d3d3bDYbaWlp9crz8vLIy8sjKiqKgIAA0tPT\n672flpZG165dSUtLIyAggG7duiGEIC0tzTmnXQhBcHDwLT+rLmoqitJSNduEbrPZqKioYPbs2WzY\nsAGz2cy3335LQkICISEhpKenU1paytixY9m9ezc2m429e/cyceJEfvKTnzBnzhxOnjzJ1KlT2bNn\nD4mJiQwbNgybzca2bdsoKrxG4tgx7N27F5vNxu7du5k0aRJvvPFGU3ddURSlQZr1tMW5c+fy1ltv\nYTQaKSsrQ6/XU1tbi9lsxmAwIIRwznIpLy/H29ub8vJyDAYD1dXVzs27vL29qaysdG7qZTAYsFkt\nPNY30jnLJSwsjJkzZzJq1Kj7GAFFUZS751Lz0PV6PTqdjoqKCqxWK1qtFp1OR21NDR4eHvTu04fg\noIcoLy0m9qdPkJSUhI+PD2azmZUrV5Kamoqvry/jx4+/adxcURSluXOJ3Rbd3NzQ6/W88MILLFy4\nkBEjRqDX65FSMmvWLP7r979Hp9dTXFzMp1u38KgsYOfK94mK7MuVK1eIi4tj48aNPP3004SGhjJi\nxAg++OCDpu6WoijKfdFsz9DrVnIuWLCg3mKf2bNns3DhQuLj41myZAmXL1+mb9++jB07hoKDO3h/\neD9e2pRGRbsumC0Wtm7d6lxtev78eWJiYrh48SJGo/G+9FFRFOVec4kzdLPZTEJCQr2yxMREampq\n2L59OwBBQUFER0cTGtqZXZmXAfh17xCOHTvK6NGj693tqHPnzoSHh980c0ZRFMUVNOuEDlBcXFzv\n5/z8fNzc3DAYDM6ygoICqqurMerte5Pnl1Wh9dBSUFBQ77NSSvLz82nTps39b7iiKMoD1mwT+uLF\ni9FqtUyfPt25+2FFRQW/+93vsFqt/Pa3vwVgw4YN5OTksOUfm/h1704UlFcxf98pxj3/PIsWLeLi\nxYuAPZkvW7YMgMcff7xpOqUoinIfNdsxdLCPo/v4+ODh4UFYWBhHjx51TkXs1asXJSUlXL16FavV\nikGn5ZEO7Th6IZdXJ0/mD7PnsGjRIt5++20iIiLIy8ujpqaGTz75hK5du97HXiqKotxbD2TaohBi\nMLAAcAOWSinn3a5+Q6Ytzp8/n2nTpt1UbjAY6N69OwMHDmT06NFYrVZyc3OJjIysd9eioqIi0tLS\naNu2LVFRUWg0zfafEkVRlFu67wldCOEGnAHigEvAIWCUlPLk932mIQldURSltXsQs1weA85KKc9L\nKa3AeuDZRvw+RVEUpREak9CDgO+u+/mSo0xRFEVpAo1J6OIWZTeN3wghXhRCHBZCHL5xGqGiKIpy\n7zQmoV8COl73cwfgyo2VpJQfSin7Sin7tmvXrhF/TlEURbmdxiT0Q8CPhBChQggtMBLYem+apSiK\notytxk5bfBp4F/u0xeVSyrn/oX4BcLGBf84fuNrAz7oKFQMVA1AxqNOa4tBJSvkfhzge6MKixhBC\nHL6TaTuuTMVAxQBUDOqoONxMrbJRFEVxESqhK4qiuIiWlNA/bOoGNAMqBioGoGJQR8XhBi1mDF1R\nFEW5vZZ0hq4oiqLcRotI6EKIwUKI00KIs0KIGU3dnvtJCHFBCPGNEOKYEOKwo+wHQohUIUSm49nX\nUS6EEAsdcflaCBHRtK1vGCHEciFEvhDi2+vK7rrPQohER/1MIURiU/Slob4nBrOEEJcdx8IxxzTh\nuvfecMTgtBBi0HXlLfa7IoToKITYJYTIEEKcEEJMdpS3qmOhUaSUzfqBfY77OaAzoAWOA2FN3a77\n2N8LgP8NZf8LzHC8ngH8j+P108C/sG/D0A842NTtb2CfBwARwLcN7TPwA+C849nX8dq3qfvWyBjM\nAqbdom6Y43vgCYQ6vh9uLf27ApiACMdrH+y7uYa1tmOhMY+WcIaudnW09/cjx+uPgPjryldKuy+A\ntkIIU1M0sDGklHuBwhuK77bPg4BUKWWhlLIISAUG3//W3xvfE4Pv8yywXkppkVJmAWexf09a9HdF\nSpkjpTzieF0GZGDf8K9VHQuN0RISemvb1VECKUKIr4QQLzrKAqWUOWA/6IEAR7krx+Zu++yqsfiN\nYzhhed1QA60gBkKIEKAPcBB1LNyxlpDQ72hXRxcSI6WMAJ4CXhFCDLhN3dYWG/j+PrtiLD4AugC9\ngRxgvqPcpWMghPAG/gFMkVKW3q7qLcpcJg4N0RIS+h3t6ugqpJRXHM/5wD+x/xudVzeU4njOd1R3\n5djcbZ9dLhZSyjwpZY2UshZYgv1YABeOgRDCA3syXyOl3OwobvXHwp1qCQm91ezqKIQwCCF86l4D\nTwLfYu9v3ZX6RGCL4/VWYKzjan8/oKTuX1MXcLd9TgaeFEL4OoYmnnSUtVg3XA8Zhv1YAHsMRgoh\nPIUQocCPgC9p4d8VIYQAlgEZUsr/u+6tVn8s3LGmvip7Jw/sV7PPYL+C/2ZTt+c+9rMz9pkJx4ET\ndX0F/IAdQKbj+QeOcgG854jLN0Dfpu5DA/u9DvuQgg372VVSQ/oMPI/9AuFZYHxT9+sexGCVo49f\nY09epuvqv+mIwWngqevKW+x3BYjFPjTyNXDM8Xi6tR0LjXmolaKKoiguoiUMuSiKoih3QCV0RVEU\nF6ESuqIoiotQCV1RFMVFqISuKIriIlRCVxRFcREqoSuKorgIldAVRVFcxP8DB6t2iZ1zZZwAAAAA\nSUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from imblearn.ensemble import BalanceCascade\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "bc = BalanceCascade(random_state=0,\n",
    "                    estimator=LogisticRegression(random_state=0),\n",
    "                    n_max_subset=10)\n",
    "bc.fit(X, y)\n",
    "X_resampled, y_resampled = bc.sample(X, y)\n",
    "colors = ['#ef8a62' if v == 0 else '#f7f7f7' if v == 1 else '#67a9cf' for v in y_resampled[0, :]]\n",
    "plt.scatter(X_resampled[0, :, 0], X_resampled[0, :, 1], c=colors, linewidth=1, edgecolor='black')\n",
    "plt.show()\n",
    "sns.despine()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python [conda root]",
   "language": "python",
   "name": "conda-root-py"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
